如何为以数组为值的对象(或字典)的属性定义领域模式?

问题描述 投票:0回答:1

我有这样的数据

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

或者我应该改变写入数据库的方式?谁能帮我解决这个问题吗?预先感谢。

react-native realm database-schema realm-js realm-database
1个回答
0
投票

以下是如何定义模式以匹配您的 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都存储一个类型(例如“食物”、“游戏”)和一个值数组。

动态密钥处理: 通过将收藏夹对象转换为收藏夹对象数组,您可以避免需要对架构内的键进行硬编码。

© www.soinside.com 2019 - 2024. All rights reserved.