我有这样的数据
PersonJSONData = {
"key1": {
"name": "odo",
"age": 10,
"favorites": {
"food": ["rice", "chocolate", "sugar"],
"game": [],
"color": ["red"]
},
"key2": {
"name": "yana",
"age": 50,
"favorites": {
"band": [],
"food": ["eggs"],
"book": ["ABC", "how to cook"]
}
},
...
}}
如何在
realm
中为 react native
编写架构?
const personSchema = {
name: "Person",
properties: {
name: string,
age: int,
// favorites: I don't know what to write here??
}
}
我尝试使用类型字典(“{}”)但它给了我一个错误:
[错误:混合属性不能包含值数组。]
当我使用“混合”类型时,我收到此错误:
[错误:仅支持领域实例。]
我需要为此创建一个对象类型吗?如果是这样,当我不确定收藏夹中的按键是什么时该怎么办?
这是我创建和编写实例的代码。
const PersonInstance = new Realm(schema: [personSchema] })
function writePerson(){
const personKeys = Object.keys(PersonJSONData)
try {
personKeys.forEach((key) => {
const { name, age, favorites } = PersonJSONData[key]
PersonInstance.write(() => {
PersonInstance.create('Person', {
name, age, favorites
})}
})
} catch(err) {
// error handling
}
}
或者我应该改变写入数据库的方式?谁能帮我解决这个问题吗?预先感谢。
以下是如何定义模式以匹配您的 PersonJSONData。
第1步:定义FavoriteItem和Favorites Schema 首先,为嵌套数据创建架构。由于收藏夹中的键可能会有所不同(例如食物、游戏、乐队),因此您可以将它们存储为每种类型的字符串列表。
const FavoriteItemSchema = {
name: 'FavoriteItem',
properties: {
type: 'string', // E.g., "food", "game", "book"
values: 'string[]', // List of favorite items, e.g., ["rice", "chocolate"]
},
embedded: true, // Embedded objects get stored inside the parent object.
};
const PersonSchema = {
name: 'Person',
properties: {
name: 'string',
age: 'int',
favorites: 'FavoriteItem[]', // List of FavoriteItem objects
},
};
第 2 步:使用架构设置领域 使用 Person 和 favoriteItem 模式初始化 Realm。
const realm = new Realm({
schema: [PersonSchema, FavoriteItemSchema],
});
第 3 步:写入前格式化数据 将数据写入 Realm 时,将 favorites 对象映射到 favoriteItem 对象列表中。
function writePerson() {
const personKeys = Object.keys(PersonJSONData);
try {
personKeys.forEach((key) => {
const { name, age, favorites } = PersonJSONData[key];
// Convert the favorites object to a list of FavoriteItem objects
const favoriteItems = Object.keys(favorites).map((type) => ({
type, // E.g., "food", "game"
values: favorites[type], // E.g., ["rice", "chocolate"]
}));
realm.write(() => {
realm.create('Person', {
name,
age,
favorites: favoriteItems,
});
});
});
} catch (err) {
console.error('Error writing person:', err);
}
}
说明 嵌入对象: 我们使用FavoriteItem作为嵌入对象,这意味着它将存储在Person对象中,而不是作为单独的Realm实体。这简化了访问和数据管理。
最喜欢的物品列表: Person 模式中的 favorites 字段是一个 favoriteItem 对象的数组。每个FavoriteItem都存储一个类型(例如“食物”、“游戏”)和一个值数组。
动态密钥处理: 通过将收藏夹对象转换为收藏夹对象数组,您可以避免需要对架构内的键进行硬编码。