CRUD - 作成 - React Native SDK
Realm インスタンスに新しい Realm オブジェクトを追加するには、 realm.create()を使用します 書込みトランザクション (write transaction) 内。 スキーマにオブジェクト型が含まれ、オブジェクトがスキーマに準拠している場合、Realm はオブジェクトを保存します。
オブジェクトの作成例では、次のスキーマを使用します。
class Person extends Realm.Object { static schema = { name: 'Person', primaryKey: '_id', properties: { _id: 'objectId', name: 'string', age: 'int?', }, }; }
class Person extends Realm.Object<Person> { _id!: Realm.BSON.ObjectId; name!: string; age?: number; static schema: ObjectSchema = { name: 'Person', primaryKey: '_id', properties: { _id: 'objectId', name: 'string', age: 'int?', }, }; }
新しいオブジェクトを作成するには
useRealm()
フックを使用して Realm インスタンスにアクセスします。handleAddPerson()
を作成します。テキスト入力値に基づいて新しいPerson
オブジェクトが作成されます。onPres を追加する
handleAddPerson()
を呼び出す送信ボタンのイベント。
1 const CreatePersonInput = () => { 2 const [name, setName] = useState(''); 3 const realm = useRealm(); 4 5 const handleAddPerson = () => { 6 realm.write(() => { 7 realm.create('Person', {_id: PERSON_ID, name: name, age: 25}); 8 }); 9 }; 10 11 return ( 12 <> 13 <TextInput value={name} onChangeText={setName} /> 14 <Button 15 onPress={() => handleAddPerson()} 16 title='Add Person' 17 /> 18 </> 19 ); 20 };
対 1 の関係を持つオブジェクトの作成
1 対 1 の関係では、1 つのオブジェクトが特定のタイプの最大 1 つの他のオブジェクトに関連付けられます。 1 対 1 の関係の詳細については、「関係と埋め込みオブジェクト 」を参照してください。
対 1 の関係を持つ オブジェクトを作成する例えでは、次のスキーマを使用して、Pe 所有者が所有できるペトが 1 つだけであることを示しています。
class Pet extends Realm.Object { static schema = { name: 'Pet', primaryKey: '_id', properties: { _id: 'objectId', name: 'string', age: 'int', animalType: 'string?', }, }; } class PetOwner extends Realm.Object { static schema = { name: 'PetOwner', primaryKey: '_id', properties: { _id: 'objectId', name: 'string', age: 'int', pet: 'Pet?', }, }; }
class Pet extends Realm.Object<Pet> { _id!: Realm.BSON.ObjectId; name!: string; age!: number; animalType!: string; static schema: ObjectSchema = { name: 'Pet', primaryKey: '_id', properties: { _id: 'objectId', name: 'string', age: 'int', animalType: 'string?', }, }; } class PetOwner extends Realm.Object<PetOwner> { _id!: Realm.BSON.ObjectId; name!: string; age?: number; pet?: Pet; static schema: ObjectSchema = { name: 'PetOwner', primaryKey: '_id', properties: { _id: 'objectId', name: 'string', age: 'int', pet: 'Pet?', }, }; }
別のオブジェクトに対する 1 の関係を持つオブジェクトを作成するには、次の手順に従います。
既存の Perl オブジェクトの Realm をクエリします。 結果を
newPet
に割り当てます。新しい OpOwner オブジェクトを作成し、
newPet
をpet
プロパティに渡します。書込みトランザクションを
handleAddPetOwner()
関数でラップします。これにより、関連付けられたPet
を持つ新しいPetOwner
オブジェクトが作成されます。onPres を追加する を呼び出す送信ボタン上の
handleAddPetOwner()
イベント。
1 const CreatePetOwnerInput = () => { 2 const [ownerName, setOwnerName] = useState(''); 3 const realm = useRealm(); 4 const newPet = useObject(Pet, PET_ID); 5 6 const handleAddPetOwner = () => { 7 // Create a new Pet Owner object, pass new Pet object in pet field 8 realm.write(() => { 9 realm.create('PetOwner', { 10 _id: PETOWNER_ID, 11 name: ownerName, 12 age: 25, 13 pet: newPet, 14 }); 15 }); 16 }; 17 18 return ( 19 <> 20 <TextInput 21 onChangeText={setOwnerName} 22 value={ownerName} 23 24 /> 25 <Button 26 onPress={() => handleAddPetOwner()} 27 title='Add New Pet Owner' 28 /> 29 </> 30 ); 31 };
ToMany の関係を持つオブジェクトの作成
1 対多の関係では、オブジェクトが特定のタイプの複数のオブジェクトに関連付けられる場合があります。 1 対多の関係の詳細については、「関係と埋め込みオブジェクト 」を参照してください。
対多の関係を持つ オブジェクトの作成例では、次のスキーマを使用して、会社が複数の従業員を使用できることを示しています。
class Employee extends Realm.Object { static schema = { name: 'Employee', primaryKey: '_id', properties: { _id: 'objectId', name: 'string', birthdate: 'date', }, }; } class Company extends Realm.Object { static schema = { name: 'Company', primaryKey: '_id', properties: { _id: 'objectId', name: 'string', employees: { type: 'list', objectType: 'Employee', optional: false, }, }, }; }
class Employee extends Realm.Object<Employee> { _id!: Realm.BSON.ObjectId; name!: string; birthdate!: Date; static schema: ObjectSchema = { name: 'Employee', primaryKey: '_id', properties: { _id: 'objectId', name: 'string', birthdate: 'date', }, }; } class Company extends Realm.Object<Company> { _id!: Realm.BSON.ObjectId; name!: string; employees!: Realm.List<Employee>; static schema: ObjectSchema = { name: 'Company', primaryKey: '_id', properties: { _id: 'objectId', name: 'string', employees: { type: 'list', objectType: 'Employee', optional: false, }, }, }; }
別のオブジェクトに対する 対多の関係を持つオブジェクトを作成するには、次の手順に従います。
新しい会社オブジェクトを作成し、前のクエリの結果を
employees
プロパティに渡します。書込みトランザクションを
handleAddCompany()
関数でラップします。これにより、Employees
の関連リストを持つ新しいCompany
オブジェクトが作成されます。onPres を追加する を呼び出す送信ボタン上の
handleAddCompany()
イベント。
1 const CreateNewCompanyInput = () => { 2 const employees = useQuery(Employee); 3 const [companyName, setCompanyName] = useState(''); 4 const realm = useRealm(); 5 6 // Create a new Company and connect our list of Employees to it 7 const handleCreateCompany = () => { 8 realm.write(() => { 9 realm.create('Company', { 10 _id: COMPANY_ID, 11 name: companyName, 12 employees: employees, 13 }); 14 }); 15 }; 16 17 return ( 18 <> 19 <TextInput 20 onChangeText={setCompanyName} 21 value={companyName} 22 23 /> 24 <Button 25 onPress={() => handleCreateCompany()} 26 title='Add New Company' 27 /> 28 </> 29 ); 30 };
埋め込みオブジェクトの作成
埋め込みオブジェクトとは、親オブジェクトの中にネストされたデータとして存在するオブジェクトです。独立した Realm オブジェクトとして存在することはできません。 埋め込みオブジェクトの詳細については、「関係と埋め込みオブジェクト 」を参照してください。
埋め込みオブジェクトを表現する例では、次のスキーマを使用して、単一のアドレスを新しい連絡先オブジェクトに埋め込むことができます。
1 class Address extends Realm.Object { 2 static schema = { 3 name: 'Address', 4 embedded: true, // default: false 5 properties: { 6 street: 'string?', 7 city: 'string?', 8 country: 'string?', 9 postalCode: 'string?', 10 }, 11 }; 12 }
1 class Contact extends Realm.Object { 2 static schema = { 3 name: 'Contact', 4 primaryKey: '_id', 5 properties: { 6 _id: 'objectId', 7 name: 'string', 8 // Embed a single object 9 address: 'Address', 10 }, 11 }; 12 }
1 class Business extends Realm.Object { 2 static schema = { 3 name: 'Business', 4 primaryKey: '_id', 5 properties: { 6 _id: 'objectId', 7 name: 'string', 8 // Embed an array of objects 9 addresses: {type: 'list', objectType: 'Address'}, 10 }, 11 }; 12 }
1 class Address extends Realm.Object<Address> { 2 street?: string; 3 city?: string; 4 country?: string; 5 postalCode?: string; 6 7 static schema: ObjectSchema = { 8 name: 'Address', 9 embedded: true, // default: false 10 properties: { 11 street: 'string?', 12 city: 'string?', 13 country: 'string?', 14 postalCode: 'string?', 15 }, 16 }; 17 }
1 class Contact extends Realm.Object { 2 _id!: string; 3 name!: string; 4 address!: Address; 5 6 static schema: ObjectSchema = { 7 name: 'Contact', 8 primaryKey: '_id', 9 properties: { 10 _id: 'objectId', 11 name: 'string', 12 // Embed a single object 13 address: 'Address', 14 }, 15 }; 16 }
1 class Business extends Realm.Object { 2 _id!: string; 3 name!: string; 4 addresses!: Realm.List<Address>; 5 6 static schema: ObjectSchema = { 7 name: 'Business', 8 primaryKey: '_id', 9 properties: { 10 _id: 'objectId', 11 name: 'string', 12 // Embed an array of objects 13 addresses: {type: 'list', objectType: 'Address'}, 14 }, 15 }; 16 }
埋め込みオブジェクトを作成するには、埋め込みオブジェクトのインスタンスを親オブジェクトの プロパティに割り当てます。
次のCreateContact
の例では、埋め込みAddress
オブジェクトを含む新しいContact
オブジェクトを作成しています。
CreateContact
コンポーネントは次の処理を実行します。
React 状態 を作成 連絡先の名前と住所の詳細を表す 変数 。
コンポーネント内で
useRealm()
フックを呼び出すことで、開いている Realm インスタンスへのアクセスを取得します。連絡先の名前と住所の
TextInput
値に基づいて、新しいAddress
埋め込みオブジェクトとContact
親オブジェクトを作成するための書込みトランザクションを実行するコンポーネント メソッドsubmitContact()
を作成します。onPres を追加します を呼び出す [送信送信] ボタンの
submitContact()
イベント。
1 const CreateContact = () => { 2 const [name, setContactName] = useState(''); 3 const [street, setStreet] = useState(''); 4 const [city, setCity] = useState(''); 5 const [country, setCountry] = useState(''); 6 const [postalCode, setPostalCode] = useState(''); 7 const realm = useRealm(); 8 9 const submitContact = () => { 10 // Create a Contact within a write transaction 11 realm.write(() => { 12 // Create an embedded Address object 13 const address = { 14 street, 15 city, 16 country, 17 postalCode, 18 }; 19 20 realm.create('Contact', { 21 _id: new Realm.BSON.ObjectID(), 22 name, 23 // Embed the address in the Contact object 24 address, 25 }); 26 }); 27 }; 28 return ( 29 <View> 30 <TextInput value={name} onChangeText={text => setContactName(text)} /> 31 <TextInput value={street} onChangeText={text => setStreet(text)} /> 32 <TextInput value={city} onChangeText={text => setCity(text)} /> 33 <TextInput value={country} onChangeText={text => setCountry(text)} /> 34 <TextInput 35 value={postalCode} 36 onChangeText={text => setPostalCode(text)} 37 /> 38 <Button 39 title='Submit Contact' 40 onPress={submitContact} 41 /> 42 </View> 43 ); 44 };
非対称オブジェクトの作成
非対称オブジェクトを使用すると、 Flexible Sync を使用している場合に、デバイスから Atlas データベースにコレクションを一方向に同期できます。 非対称オブジェクトの詳細については、「 Atlas へのデータのストリーム 」を参照してください。
非対称オブジェクトの作成例では、デバイスから Atlas データベースに一方向に気象関連データを送信するための 気象センサー オブジェクトを定義する次のスキーマを使用します。
class WeatherSensor extends Realm.Object { static schema = { name: 'WeatherSensor', // sync WeatherSensor objects one way from your device // to your Atlas database. asymmetric: true, primaryKey: '_id', properties: { _id: 'objectId', deviceId: 'string', temperatureInFahrenheit: 'int', barometricPressureInHg: 'float', windSpeedInMph: 'float', }, }; }
class WeatherSensor extends Realm.Object<WeatherSensor> { _id!: Realm.BSON.ObjectId; deviceId!: string; temperatureInFahrenheit!: number; barometricPressureInHg!: number; windSpeedInMph!: number; static schema: ObjectSchema = { name: 'WeatherSensor', // sync WeatherSensor objects one way from your device // to your Atlas database. asymmetric: true, primaryKey: '_id', properties: { _id: 'objectId', deviceId: 'string', temperatureInFahrenheit: 'int', barometricPressureInHg: 'float', windSpeedInMph: 'float', }, }; }
Realm.create()を使用して、書込みトランザクション内に非対称オブジェクトを作成できます。 非対称オブジェクトを作成する場合、 Realm.create()
はオブジェクト自体ではなくundefined
を返します。
const App = () => { // Getting access to our opened realm instance const realm = useRealm(); const handleAddSensor = () => { realm.write(() => { realm.create('WeatherSensor', { _id: weatherSensorPrimaryKey, deviceId: 'WX1278UIT', temperatureInFahrenheit: 66.7, barometricPressureInHg: 29.65, windSpeedInMph: 2, }); }); }; return ( <Button title='Add A New Sensor' onPress={() => handleAddSensor()} /> ); };