Docs Menu
Docs Home
/ /
Atlas Device SDK

クイック スタート - Node.js SDK

項目一覧

  • Realm のインポート
  • オブジェクトモデルを定義する
  • Realm を開く
  • オブジェクトの検索、ソート、フィルタリング
  • Realm オブジェクトの作成、変更、削除
  • コレクションの監視
  • Realm を閉じる
  • Device Sync の追加(任意)
  • 前提条件
  • アプリを初期化する
  • ユーザーの認証
  • オブジェクトモデルを定義する
  • 同期された Realm を開く

このページには、Realm をアプリにすばやく統合するための情報が含まれています。

まだ行っていない場合は、Realm Node.js SDK をインストールします。

Realm を使用するソースファイルの先頭に、SDK と BSON ライブラリをインポートするための次の行を追加します。

import Realm, { BSON } from "realm";

アプリケーションのオブジェクトモデルによって、Realm 内に保存できるデータが定義されます。

Realm オブジェクトタイプを定義するには、タイプの namepropertiesを指定する スキーマ オブジェクト を作成します。 タイプ名は、Realm 内のオブジェクトタイプ間で一意である必要があります。 特定のプロパティを定義する方法の詳細については、「オブジェクト プロパティの定義 」を参照してください。

次のコードは、 Taskオブジェクトのオブジェクトモデルを定義する方法を示しています。 この例では、次のことが行われます。

  • primaryKeyは タイプint_idです。 プライマリキーに使用される別の一般的な型はObjectId です。

  • nameフィールドは必須です。

  • statusフィールドとowner_idフィールドは任意であり、データ型の直後に疑問符で示されます。

export class QuickstartTask extends Realm.Object {
static schema = {
name: "Task",
properties: {
_id: "objectId",
name: "string",
status: "string?",
owner_id: "string?",
},
primaryKey: "_id",
};
}
export class QuickstartTask extends Realm.Object<Task> {
_id!: BSON.ObjectID;
name!: string;
status?: string;
owner_id?: string;
static schema: ObjectSchema = {
name: "Task",
properties: {
_id: "objectId",
name: "string",
status: "string?",
owner_id: "string?",
},
primaryKey: "_id",
};
}

Realm を開くには、 Realm.BaseConfigurationオブジェクトをRealm.open() に渡します。

const realm = await Realm.open({
schema: [QuickstartTask],
});

次のコードは、次の方法を示しています。

  • "Task" オブジェクトタイプのすべてのインスタンスをクエリします。

  • クエリをフィルタリングして、「オープン」であるタスクのみを検索します。

  • タスクを 名前の昇順でソートします。

// Query for specific obect using primary key.
const specificTask = realm.objectForPrimaryKey(QuickstartTask, testId);
// Query realm for all instances of the "Task" type.
const tasks = realm.objects(QuickstartTask);
// Filter for all tasks with a status of "Open".
const openTasks = tasks.filtered("status = 'Open'");
// Sort tasks by name in ascending order.
const tasksByName = tasks.sorted("name");

Realm を開くと、その中のオブジェクトを作成、変更、および削除できます。 すべての書込み (write) 操作は書込みトランザクション 内で発生する必要があります。

const allTasks = realm.objects(QuickstartTask);
// Add a couple of Tasks in a single, atomic transaction.
realm.write(() => {
realm.create(QuickstartTask, {
_id: firstId,
name: "go grocery shopping",
status: "Open",
});
realm.create(QuickstartTask, {
_id: secondId,
name: "go exercise",
status: "Open",
});
});
const task1 = allTasks.find(
(task) => task._id.toString() == firstId.toString()
);
const task2 = allTasks.find(
(task) => task._id.toString() == secondId.toString()
);
realm.write(() => {
// Modify an object.
task1!.status = "InProgress";
// Delete an object.
realm.delete(task2!);
});

Realm.addLister() でイベント ハンドラーを登録することで、Realm 、コレクション、またはオブジェクトの変更 を監視できます。Object.addLister() Collection.addLister()メソッド。

重要

順序は重要

コレクション通知ハンドラーでは、削除、挿入、変更の順に常に変更を適用します。 削除前に挿入を処理すると、予期しない動作が発生する可能性があります。

次の例では、アプリケーション開発者はTaskコレクションの変更を監視しています。

// Define the collection notification listener.
const listener = (tasks, changes) => {
// Update UI in response to deleted objects.
changes.deletions.forEach((index) => {
// Deleted objects cannot be accessed directly,
// but we can update a UI list, etc. knowing the index.
console.log(`A task was deleted at the ${index} index.`);
// ...
});
// Update UI in response to inserted objects.
changes.insertions.forEach((index) => {
const insertedTasks = tasks[index];
console.log(`insertedTasks: ${JSON.stringify(insertedTasks, null, 2)}`);
// ...
});
// Update UI in response to modified objects.
// `newModifications` contains an index to the modified object's position
// in the collection after all deletions and insertions have been applied.
changes.newModifications.forEach((index) => {
const modifiedTask = tasks[index];
console.log(`modifiedTask: ${JSON.stringify(modifiedTask, null, 2)}`);
// ...
});
};
// Observe collection notifications.
tasks.addListener(listener);
// Define the collection notification listener.
//@ts-expect-error TYPEBUG: OrderedCollection is incorrectly implemented
const listener: Realm.CollectionChangeCallback = (
tasks: Realm.OrderedCollection<QuickstartTask>,
changes: Realm.CollectionChangeSet
) => {
// Update UI in response to deleted objects.
changes.deletions.forEach((index) => {
// Deleted objects cannot be accessed directly,
// but we can update a UI list, etc. knowing the index.
console.log(`A task was deleted at the ${index} index.`);
// ...
});
// Update UI in response to inserted objects.
changes.insertions.forEach((index) => {
const insertedTasks = tasks[index];
console.log(`insertedTasks: ${JSON.stringify(insertedTasks, null, 2)}`);
// ...
});
// Update UI in response to modified objects.
// `newModifications` contains an index to the modified object's position
// in the collection after all deletions and insertions have been applied.
changes.newModifications.forEach((index) => {
const modifiedTask = tasks[index];
console.log(`modifiedTask: ${JSON.stringify(modifiedTask, null, 2)}`);
// ...
});
};
// Observe collection notifications.
//@ts-expect-error TYPEBUG: OrderedCollection is incorrectly implemented
tasks.addListener(listener);

Realm.close()の呼び出し メソッドを Realm インスタンスで実行し、メモリリークを回避するために使用されます。

// Close the realm.
realm.close();

このセクションでは、匿名ユーザーで認証し、Flexible Sync レルムを開いてデバイス間でデータを同期する方法について説明します。

認証や同期などの App Services 機能を使用するには、まず App Services App ID を使用して App Services App にアクセスする必要があります。 アプリ ID は、App Services UI で確認できます

// Initialize your App.
const app = new Realm.App({
id: "<yourAppId>",
});

ユーザーを認証してログインするには、 App.logIn()を呼び出します。 匿名認証が有効になっている場合、ユーザーは識別情報を提供することなく、アプリにすぐにログインできます。

// Initialize your App.
const app = new Realm.App({
id: "<yourAppId>",
});
// Authenticate an anonymous user.
const anonymousUser = await app.logIn(Realm.Credentials.anonymous());

同期された Realm のオブジェクトモデルは、ローカル専用の Realmと同じように動作します。 ローカル専用の Realm の場合と同様に、オブジェクトモデルを定義します。

export class QuickstartTask extends Realm.Object {
static schema = {
name: "Task",
properties: {
_id: "objectId",
name: "string",
status: "string?",
owner_id: "string?",
},
primaryKey: "_id",
};
}
export class QuickstartTask extends Realm.Object<Task> {
_id!: BSON.ObjectID;
name!: string;
status?: string;
owner_id?: string;
static schema: ObjectSchema = {
name: "Task",
properties: {
_id: "objectId",
name: "string",
status: "string?",
owner_id: "string?",
},
primaryKey: "_id",
};
}

アプリを初期化し、ユーザーを認証し、オブジェクトモデルを定義したら、 SyncConfiguration を作成できます。

Flexible Sync レルムを開くには、 Realm.open()を呼び出します。 baseConfiguration オブジェクトをsync 渡します。このオブジェクトには、SyncConfiguration オブジェクト を定義する プロパティが含まれている必要があります。Flexible Sync を使用するには、SyncConfiguration にuserflexible: trueを含む を含める必要があります。

さらに、Realm からの読み取りや書込みを行う前に、少なくとも 1 つのサブスクリプションが必要です。 Realm ファイルが最初に開かれたときに初期サブスクリプションセットを定義するには、 Configuration.sync.initialSubscriptionsを使用します。

// Initialize your App.
const app = new Realm.App({
id: "<yourAppId>",
});
// Authenticate an anonymous user.
const anonymousUser = await app.logIn(Realm.Credentials.anonymous());
// Create a `SyncConfiguration` object.
const config = {
schema: [QuickstartTask],
sync: {
// Use the previously-authenticated anonymous user.
user: anonymousUser,
// Set flexible sync to true to enable sync.
flexible: true,
// Define initial subscriptions to start syncing data as soon as the
// realm is opened.
initialSubscriptions: {
update: (subs, realm) => {
subs.add(
// Get objects that match your object model, then filter them by
// the `owner_id` queryable field
realm
.objects(QuickstartTask)
.filtered(`owner_id == "${anonymousUser.id}"`)
);
},
},
},
};
const realm = await Realm.open(config);
// Initialize your App.
const app = new Realm.App({
id: "<yourAppId>",
});
// Authenticate an anonymous user.
const anonymousUser = await app.logIn(Realm.Credentials.anonymous());
// Create a `SyncConfiguration` object.
const config: Realm.Configuration = {
schema: [QuickstartTask],
sync: {
// Use the previously-authenticated anonymous user.
user: anonymousUser,
// Set flexible sync to true to enable sync.
flexible: true,
// Define initial subscriptions to start syncing data as soon as the
// realm is opened.
initialSubscriptions: {
update: (subs, realm) => {
subs.add(
// Get objects that match your object model, then filter them by
// the `owner_id` queryable field
realm
.objects(QuickstartTask)
.filtered(`owner_id == "${anonymousUser.id}"`)
);
},
},
},
};
const realm = await Realm.open(config);

同期された Realm で を読み取り書込み変更を監視する構文は、上記の同期されていない Realm の構文と同じです。 ローカル データを操作している間に、バックグラウンド スレッドが変更セットを効率的に統合、アップロード、ダウンロードします。

次へ

Atlas Device SDK Docsへようこそ