【问题标题】:Realm.objects() return empty objects on React NativeRealm.objects() 在 React Native 上返回空对象
【发布时间】:2020-04-09 07:42:14
【问题描述】:

我正在 React Native 上测试 Realm 数据库(在 Android 上测试),我在检索数据时遇到了一些问题。

我使用这个函数来持久化用户

insertData = async (data) => {
        await Realm.open({schema: [UserSchema]})
            .then( realm => {
                realm.write(()=>{
                    realm.create('User', {id: '1325487', nickname: "Jack", age: 21});
                })

                realm.close();
            })
            .catch(error => {
                console.log(error);
            });

    }

我正在尝试使用这个来检索数据:

findAll = () => {
        Realm.open({schema: [UserSchema]})
            .then( realm => {
                let users = realm.objects('User')
                console.log(users)

            }).catch(error => {
                console.log(error);
            })
    }

这就是我得到的,一个空对象数组:

{"0": {}, "1": {}, "10": {}, "11": {}, "12": {}, "13": {}, 
"14": {}, "15": {}, "16": {}, "17": {}, "18": {}, "19": {}, "2": 
{}, "20": {}, "21": {}, "22": {}, "23": {}, "24": {}, "25": {}, "26": {}, "27": {}, "28": {}, "29": {}, "3": {}, "30": {}, "31": {}, "32": {}, "33": {}, "34": {}, "35": {}, "36": {}, "37": {}, "38": {}, "39": {}, "4": {}, "5": {}, "6": {}, "7": {}, "8": {}, "9": {}}

这是用户架构:

const UserSchema = {
    name: 'User',
    properties: {
        id:         'string',
        nickname:   'string',
        age:        'int'
    }
}

我认为数据正在被持久化,因为当我保存不同的用户并使用过滤器时,结果的数量会有所不同。你知道为什么只有空的物体来吗?或者以某种方式查看我的领域数据库中的内容?

【问题讨论】:

  • 您找到解决方案了吗?
  • 同样的问题,还没有解决方案:(
  • 我只是删除 node_modules 并重新安装
  • @AnthonyDeSmet Dis 你有什么解决办法吗?
  • @AmilaDulanjana

标签: javascript react-native realm


【解决方案1】:

我也遇到了同样的问题,在 react native 中从领域 db 检索数据时出现一组空对象。

我在Android Studio logcat中发现是数据不可见,看起来像:

{"0": {}, "1": {}, "10": {}, "11": {}, "12": {}, "13": {}, "14": {}, "15": {}, "16": {}, "17": {}, "18": {}, "19": {}, "2": {}, "20": {}, "21": {}, "22": {}, "23": {}, "24": {}, "25": {}, "26": {}, "27": {},

但是,您在 Visual Studio(即终端)中检查 logcat 你可以看到结果。

结论:响应中有数据,在Android Studio logcat中看不到,但在Visual Studio终端中看不到。

【讨论】:

    【解决方案2】:

    tl;博士

    const virtualUsers = realm.objects('User');
    const users = JSON.parse(JSON.stringify(virtualUsers));
    console.log(users);
    

    说明

    领域结果是一个“虚拟”对象

    领域结果包含虚拟/代理对象。它们包含对象属性的getterssetters,但它们本身不包含可枚举的属性。这就是调试时会看到Symbol(_external) 出现的原因。

    更多

    Realm.Object

    Realm 确实在 Result 对象上定义了 toJSON() 函数。这对于将对象强制转换为实际值很有用。

    代替:

    let users = realm.objects('User')
    

    使用:

    let users = JSON.parse(JSON.stringify(realm.objects('User')))
    

    警告

    这会带来性能损失。只有在必须使用具有可枚举属性的对象时才应该这样做。

    【讨论】:

    • 这很奇怪.. node.js 的文档中没有任何地方注意到这样的事情.. 我一直在按照他们的示例代码编写代码,但它没有工作。尝试了您的解决方案,它有效..
    【解决方案3】:

    我也有同样的问题,但是当我传递我想要的属性的名称时,我可以得到值,例如:

    user.id
    user.nickname
    user.age
    

    记住,如果是列表,则必须使用循环扫描数组,例如:

    map.listUser(item => {
       console.log(item.id);
       console.log(item.nickname);
       console.log(item.age);
    })
    

    对我来说,这解决了取对象值的问题。但是,我仍然看不到日志中的项目。

    【讨论】:

      【解决方案4】:

      您使用的是 5.0.2 还是 5.0.1 领域?
      如果是小心的话,realm js 5.0.2 https://github.com/realm/realm-js/releases/tag/v5.0.3 有一个bug

      将领域更新到版本 5.0.3,它应该可以工作

      【讨论】:

        【解决方案5】:

        我只是删除了 node_modules 并重新安装。 '-'谢谢!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-02-14
          • 1970-01-01
          • 1970-01-01
          • 2019-07-03
          • 1970-01-01
          • 2018-07-24
          • 1970-01-01
          相关资源
          最近更新 更多