关于commitWriteTransaction的Realm.io RLMException - 索引越界

时间:2016-07-04 23:42:16

标签: ios realm

我已成功使用以下代码,突然之间,对于我的某个模型,Realm会在commitWriteTransaction上抛出索引超出范围的错误。 Realm对象已成功创建,并且仅在下面的最后一行显示错误,并且仅在我的某个模型中发生。我最近更新了服务器返回,但模型仍然显示正确,因为它从服务器数据成功创建了一个对象(模型如下所示)。

顺便说一下,每次崩溃时我都需要删除并重新安装应用程序。如果我再次尝试打开它,它会在到达任何地方之前崩溃(我假设这是因为数据库搞砸了)。

发生了什么?我该如何解决这个问题?

代码:

NSDictionary *responseDictionary = (NSDictionary *)responseObject; //response from AFNetworking call to my server
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
for (NSDictionary *dict in responseDictionary){
    MyModel *object = [[class alloc] initMyModelWithDictionary:dict]; //class is known
    // (print object) - see output below
    [realm addOrUpdateObject:object];
}
[realm commitWriteTransaction]; // Error thrown here

模型打印输出示例(来自dict的其中一个)

MyModel {
    id = 32;
    created_at = 2016-07-02 03:39:15 +0000;
    updated_at = 2016-07-02 03:39:15 +0000;
    intA = 1;
    intB = 2;
    intC = 0;
    boolA = 1;
    boolB = 1;
    boolC = 1;
    boolD = 0;
}

错误:

Terminating app due to uncaught exception 'RLMException', 
reason: 'Index 0 is out of bounds (must be less than 0)'

1 个答案:

答案 0 :(得分:3)

仅当RLMArrayRLMLinkingObjectsRLMResults具有越界访问权限时才会抛出此异常。假定索引0超出范围,则在访问第0个索引时它必须为空。当您致电commitWriteTransaction时,Realm本身并未访问此集合。相反,它正在向执行越界访问的代码发送通知。通过启用异常断点,您应该能够轻松找到发生这种情况的位置。