Realm.js字符串列表属性查询问题及报错排查
搞定Realm.js数组属性的包含查询问题
嘿,我来帮你解决这个查询Realm数组属性时遇到的问题~先给你拆解下你碰到的两个错误原因,再给你正确的写法:
先说说你俩错误的根源
- 关于
a的错误:你用了=来做相等判断,但Realm的查询语法里必须用==;另外还要确认你的对象是通过Realm的事务创建的(直接给对象赋值属性会出问题,因为Realm对象是受事务管理的)。 - 关于
b的错误:CONTAINS是给字符串用的运算符,不能直接怼在数组(Realm里叫Table类型)上,自然会报错不支持啦。
正确的实现方式
要筛选出book_names包含'B'的Bookrack对象,用ANY配合==就对了,同时要记得所有对象的创建、属性修改都得在Realm的写入事务里操作。给你完整的正确代码示例:
// 定义Bookrack的Schema const BookrackSchema = { name: 'Bookrack', properties: { book_names:'string[]', } }; // 初始化Realm实例 const realm = new Realm({schema: [BookrackSchema]}); // 必须在write事务里创建/修改Realm对象 realm.write(() => { // 创建三个书架对象 realm.create('Bookrack', {book_names: ['A','B','C']}); realm.create('Bookrack', {book_names: ['B','C','D']}); realm.create('Bookrack', {book_names: ['C','D','E']}); }); // 正确的查询语句 const targetBookracks = realm.objects('Bookrack').filtered(`ANY book_names == $0`, 'B'); console.log(targetBookracks); // 这里就会返回你想要的Bookrack1和Bookrack2啦
额外小技巧
- 如果需要忽略大小写查询(比如不管是'B'还是'b'都能匹配到),可以用
CONTAINS[c],写法是这样的:const caseInsensitiveResult = realm.objects('Bookrack').filtered(`ANY book_names CONTAINS[c] $0`, 'b'); ANY的作用就是检查数组里有没有至少一个元素满足条件,完全符合你要找包含'B'的需求~
内容的提问来源于stack exchange,提问作者lsdoy
相关产品推荐
相关产品推荐

