Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

CRUD - 作成 - React Native SDK

項目一覧

  • 対 1 の関係を持つオブジェクトの作成
  • ToMany の関係を持つオブジェクトの作成
  • 埋め込みオブジェクトの作成
  • 非対称オブジェクトの作成

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?',
},
};
}

新しいオブジェクトを作成するには

  1. useRealm()フックを使用して Realm インスタンスにアクセスします。

  2. handleAddPerson()を作成します。テキスト入力値に基づいて新しいPersonオブジェクトが作成されます。

  3. onPres を追加するhandleAddPerson() を呼び出す送信ボタンのイベント。

1const 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 の関係を持つ オブジェクトを作成する例えでは、次のスキーマを使用して、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 の関係を持つオブジェクトを作成するには、次の手順に従います。

  1. 既存の Perl オブジェクトの Realm をクエリします。 結果をnewPetに割り当てます。

  2. 新しい OpOwner オブジェクトを作成し、 newPetpetプロパティに渡します。

  3. 書込みトランザクションをhandleAddPetOwner()関数でラップします。これにより、関連付けられたPetを持つ新しいPetOwnerオブジェクトが作成されます。

  4. onPres を追加する を呼び出す送信ボタン上のhandleAddPetOwner() イベント。

1const 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};

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,
},
},
};
}

別のオブジェクトに対する 対多の関係を持つオブジェクトを作成するには、次の手順に従います。

  1. useQuery() を使用して、既存のすべての 従業員 オブジェクトの Realm をクエリします。

  2. 新しい会社オブジェクトを作成し、前のクエリの結果をemployeesプロパティに渡します。

  3. 書込みトランザクションをhandleAddCompany()関数でラップします。これにより、 Employeesの関連リストを持つ新しいCompanyオブジェクトが作成されます。

  4. onPres を追加する を呼び出す送信ボタン上のhandleAddCompany() イベント。

1const 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 オブジェクトとして存在することはできません。 埋め込みオブジェクトの詳細については、「関係と埋め込みオブジェクト 」を参照してください。

埋め込みオブジェクトを表現する例では、次のスキーマを使用して、単一のアドレスを新しい連絡先オブジェクトに埋め込むことができます。

1class 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}
1class 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}
1class 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}
1class 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}
1class 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}
1class 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コンポーネントは次の処理を実行します。

  1. React 状態 を作成 連絡先の名前と住所の詳細を表す 変数 。

  2. コンポーネント内でuseRealm()フックを呼び出すことで、開いている Realm インスタンスへのアクセスを取得します。

  3. 連絡先の名前と住所のTextInput値に基づいて、新しいAddress埋め込みオブジェクトとContact親オブジェクトを作成するための書込みトランザクションを実行するコンポーネント メソッドsubmitContact()を作成します。

  4. onPres を追加します を呼び出す [送信送信] ボタンのsubmitContact() イベント。

1const 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()}
/>
);
};

戻る

CRUD