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

时间:2015-10-24 06:55:34

标签: realm

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

首先,请参阅my sample code

狗班

router = routers.DefaultRouter(trailing_slash=True)
router.register(r'mymodels', views.MyModelViewSet)

和人类

Dog.h
@interface Dog : RLMObject

@property NSString *name;
@property NSInteger age;

@end

RLM_ARRAY_TYPE(Dog) // define RLMArray<Dog>

然后,我为人和狗创建数据(1000000条记录) - 1个人将拥有1只狗。在某些情况下我陷入困境

  1. 如何让人有狗的名字是“雷克斯”?我研究它,但没有目标C的指南
  2. 删除对象的表现似乎很慢 我试图删除的人有一个名字是“Ethan”,性能很慢,并在执行半名单时崩溃应用程序。我想我用不正确的方法来删除对象。

    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>
    
  3. 结果是&gt; 52000记录,名称为“Ethan”,app只删除其中一半(26000)

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

      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];
      
    2. 目前尚不清楚如何在创建DB后重命名,删除或添加新列(除了使用删除数据库并再次重新创建数据库的最简单方法之外)

    3. 用于浏览在桌面上创建的数据文件的工具(Realm浏览器)在查询数据方面没有太大的灵活性。它只允许浏览数据但不允许使用某种条件进行查询。如果我遗失了某些内容,请指导我使用此工具查询数据。

    4. 对于疑难解答,我可能是客户端应用程序中的现有数据库,我想在我的项目中导入它来解决客户端的错误。那么,我如何使用Realm DB呢?

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

      [Person deleteWhereObject:@"name = 'Ethan'"];
      
    6. 然后,我再次插入数据,文件大小继续增加。我不知道我的步骤有什么问题。

      希望尽快得到您的支持!

1 个答案:

答案 0 :(得分:2)

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

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

  3. 请参阅我对问题2的回答。

  4. 更改您的架构,碰撞RLMRealmConfiguration的schemaVersion并提供迁移阻止,如果您重命名属性或更改其类型。

  5. 这还不可能,但仍在制作中。这由issue #28 in the realm-browser-osx repo跟踪。

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

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