如何使用 Objective C 查询 Realm DB 中的嵌套对象

Posted

技术标签:

【中文标题】如何使用 Objective C 查询 Realm DB 中的嵌套对象【英文标题】:How can query nested object in Realm DB with Objective C 【发布时间】:2015-10-24 06:55:34 【问题描述】:

我正在研究如何在我的新项目中使用 Realm DB,但遇到了一些问题。请分享您在 Realm DB 工作时的经验。很抱歉我的问题列表很长。

首先请参考my sample code

狗类

Dog.h
@interface Dog : RLMObject

@property NSString *name;
@property NSInteger age;

@end

RLM_ARRAY_TYPE(Dog) // define RLMArray<Dog>

还有人类

Person.h
@interface Person : RLMObject

@property NSString             *name;
@property NSInteger             age;

// to-many relationship
@property RLMArray<Dog *><Dog> *dogs;

@end

RLM_ARRAY_TYPE(Person) // define RLMArray<Person>

然后,我为人和狗创建数据(1000000 条记录)- 1 个人将拥有 1 条狗。在某些情况下我被卡住了

    如何让人们拥有名为“Rex”的狗?我对其进行了研究,但没有针对目标 C 的指南

    删除对象的性能似乎很慢 我试图删除一个名为“Ethan”的人,当它执行半个列表时性能很慢并且应用程序崩溃。我想我使用了不正确的方式来删除对象。

    RLMResults *people = [Person objectsWhere:@"name == 'Ethan'"];
    // Get the default Realm
    RLMRealm *realm = [RLMRealm defaultRealm];
    
    [realm beginWriteTransaction];
    
    for (int i=0; i< people.count; i++) 
        Person *aPerson = [people objectAtIndex:i];
        [realm deleteObject:aPerson];
    
    
    [realm commitWriteTransaction];
    

结果是 >52000 条记录,名称为“Ethan”,应用仅删除其中一半(26000)

    我不知道如何使用 Realm 删除有条件的记录。我想我会为我的问题 #2 编写如下代码

    [Person deleteWhereObject:@"name = 'Ethan'"];
    

    目前尚不清楚在创建数据库后如何重命名、删除或添加新列(除了使用最简单的方法,即删除数据库并重新创建它)

    用于浏览在桌面上创建的数据文件的工具(Realm 浏览器)在查询数据方面没有提供很大的灵活性。它只允许浏览数据,但不允许使用特定条件进行查询。如果我丢失了东西,请指导我使用这个工具查询数据。

    对于故障排除,我可能有来自客户端应用程序的现有数据库,我想将其导入我的项目中以解决客户端的错误。那么,如何使用 Realm DB 做到这一点?

    在 Person 和 Dog 表插入 1000000 条记录后,DB 大小为 52.8 MB。但是在我调用删除所有数据后,数据库大小增加到 92.3 MB

    // delete all object
    [realm beginWriteTransaction];
    [realm deleteAllObjects];
    [realm commitWriteTransaction];
    

然后,我再次插入数据,文件大小继续增加。我不知道我的步骤出了什么问题。

希望尽快得到您的支持!

【问题讨论】:

【参考方案1】:

    RLMResults *people = [Person objectsWhere:@"ANY dogs.name == 'Rex'"];

    deleteObjects: 与检索到的RLMResults 一起使用,而不是自己删除每个对象。如果您枚举,我建议使用NSFastEnumerationfor (… in …)。请注意,RLMResults 是自动更新的,因此如果您同时进行更改,那么您可能会遇到意外。

    查看我对问题 2 的回答。

    如果您重命名属性或更改其类型,请更改您的架构,提升您的 RLMRealmConfiguration 的 schemaVersion 并提供迁移块。

    这还不可能,但仍在酝酿之中。这是由issue #28 in the realm-browser-osx repo 跟踪的。

    如果您希望能够写入文件,请将领域文件放入应用程序包中并在运行时将其复制到用户数据目录(例如 RLMRealm.defaultConfiguration.path)。

    文件大小爆炸,因为没有发生压缩。您可以通过使用writeCopyToPath: 编写压缩副本来强制执行此操作。你可以这样做,例如在应用程序启动时,因为否则要确保所有 RLMRealm 实例之前都被拆除是非常重要的。

【讨论】:

以上是关于如何使用 Objective C 查询 Realm DB 中的嵌套对象的主要内容,如果未能解决你的问题,请参考以下文章

在同一个项目中同时使用 Realm Swift 和 Realm Objective-C

Android Realm数据库使用

Objective-C中的领域日期范围查询

将 NSArray 对象写入领域数据库 - Objective C

在 IOS(Objective-C)中有效地解析 JSON 到 Realm DB

使用 Objective C 创建并从 Swift 获取的核心数据