Atlas Device SDK 已弃用。 有关详细信息,请参阅弃用页面。
10.5.0 版本中的新增功能。
Overview
Realm集是一种特殊对象,允许您存储唯一值的集合。 Realm集基于JavaScript 集 ,但只能包含单一类型的值,并且只能在写事务(write transaction)中修改。集合允许您执行数学运算,例如查找两个集合之间的并集、交集或差值。要学习;了解有关执行这些操作的更多信息,请参阅 MDN 文档中的“实施基本设立操作”。
Realm 对象模型
要将属性类型定义为Realm 集,请在该集中指定所需的数据类型,然后指定 <> 。 实例,对于由整数值组成的集合,请指定"int<>" 。
const characterSchema = { name: "Character", primaryKey: "_id", properties: { _id: "objectId", name: "string", levelsCompleted: "int<>", inventory: "string<>", }, };
使用集合创建对象
要创建具有Realm Set属性的对象,您必须在写事务(write transaction)中创建该对象。定义 Realm 对象时,通过传递空数组或具有初始值的数组来初始化Realm 集。
let playerOne, playerTwo; realm.write(() => { playerOne = realm.create("Character", { _id: new BSON.ObjectId(), name: "PlayerOne", inventory: ["elixir", "compass", "glowing shield"], levelsCompleted: [4, 9], }); playerTwo = realm.create("Character", { _id: new BSON.ObjectId(), name: "PlayerTwo", inventory: ["estus flask", "gloves", "rune"], levelsCompleted: [1, 2, 5, 24], }); });
将项目添加到 Set 中
要将项目添加到集合中,请将新值传递给写事务(write transaction)中的<Realm.Set>.add()方法。
realm.write(() => { playerOne.inventory.add("hammer"); playerOne.levelsCompleted.add(32); });
检查集是否包含特定项目
要确定集合是否包含特定值,请将该值传递给<Realm.Set>.has()方法。 如果集合包含指定的值, set.has()方法将返回 true。
// check if playerTwo has completed level 3 by calling the `has()` method // on the Realm Set object const playerTwoHasCompletedLevelThree = playerTwo.levelsCompleted.has(3); console.log( `Is level three completed by playerTwo: ${playerTwoHasCompletedLevelThree}` );
检查集合的大小
要了解集合中有多少项,可以检查集合的size属性。
// check how many items playerTwo has in his inventory through the `size` // property of the Realm Set object const playerTwoInventorySize = playerTwo.inventory.size; console.log(`playerTwo has ${playerTwoInventorySize} inventory items`);
从集合中删除项目
要从集中删除特定值,请在写事务(write transaction)中将该值传递给<Realm.Set>.delete()方法。
realm.write(() => { // remove the compass from playerOne's inventory by calling the // `delete()` method of the Realm Set object within a write transaction playerOne.inventory.delete("compass"); });
从集中删除所有项目
要清除该集合,请在写事务(write transaction)中运行<Realm.Set>.clear()方法。
realm.write(() => { // clear all data from the inventory slot of playerTwo by calling // the `clear()` method of the Realm Set object in a write transaction playerTwo.inventory.clear(); });
遍历集
要遍历设立,请使用 <Realm.Set>.forEach() 方法或替代迭代方法。
playerOne.inventory.forEach((item) => { console.log(item); });
例子
按顺序遍历集合
Realm 集的顺序可能与添加项目的顺序不同。
您可以通过在添加新值时更新数组来追踪设置顺序。例如:
function updateSetAndOrderedSetArray(set, orderedArray, value) { const oldSize = set.size; set.add(value); if (set.size > oldSize) { orderedArray.push(value); } } let playerOne; let levelsCompletedInOrder = []; const realm = await Realm.open({ path: "realm-files/data-type-realm", schema: [characterSchema], }); realm.write(() => { playerOne = realm.create("Character", { _id: new BSON.ObjectId(), name: "PlayerOne", inventory: ["potion", "wand", "spell book"], levelsCompleted: [], }); }); realm.write(() => { updateSetAndOrderedSetArray( playerOne.levelsCompleted, levelsCompletedInOrder, 5 ); }); realm.write(() => { updateSetAndOrderedSetArray( playerOne.levelsCompleted, levelsCompletedInOrder, 12 ); }); realm.write(() => { updateSetAndOrderedSetArray( playerOne.levelsCompleted, levelsCompletedInOrder, 2 ); }); realm.write(() => { updateSetAndOrderedSetArray( playerOne.levelsCompleted, levelsCompletedInOrder, 7 ); }); console.log("set ordered", Array.from(playerOne.levelsCompleted)); // not necessarily [5, 12, 2, 7] console.log("insert ordered", levelsCompletedInOrder); // [5, 12, 2, 7] // close the realm realm.close();