【问题标题】:Updating an object in Realm在 Realm 中更新对象
【发布时间】:2015-03-19 17:25:13
【问题描述】:

我将如何更新 Realm 中的对象?似乎在编辑/更新对象时找不到任何东西。有任何想法吗?谢谢

【问题讨论】:

    标签: ios realm


    【解决方案1】:

    这里是the documentation on updating objects in Realm

    这是另一个更新对象的选项,而不是其他答案中讨论的选项。

    很多时候,当我想更新对象时,我真的只需要更新一两个属性,Realm 的一件烦人的事情是持久化对象的属性更改需要包装在一个写事务中,所以我通常向我的对象添加一个包装器方法以稍微清理界面:

    @implementation SomeRealmClass
    
        - (void)update:(void (^)(SomeRealmClass *instance))updateBlock
        {
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
                RLMRealm *realm = [RLMRealm defaultRealm];
                [realm beginWriteTransaction];
                updateBlock(self);
                [realm commitWriteTransaction];
    
            });
        }
    
    @end
    

    这样,我可以像这样更新一个对象:

    SomeRealmClass *instance = [[SomeRealmClass allObjects] objectAtIndex:0];
    
    [instance update:^(SomeRealmClass *instance) {
        instance.foo = @"foo 2";
        instance.bar = @"bar 2";
    }];
    

    【讨论】:

    • 这实际上是行不通的,因为您在错误的线程上修改了RLMObject 实例
    • @segiddins 你说得对,我正在调查 Realm,这最初似乎可行,但最终失败了。不幸的是,我最终没有在项目中使用 Realm,所以我从来没有费心去找出解决这个特定线程问题的最佳方法。如果您能就更好的方式为子孙后代提供一些反馈,我会很棒
    【解决方案2】:

    您可以使用 RLMRealm 类中的以下 API:

    – addOrUpdateObject:
    – addOrUpdateObjectsFromArray:
    

    https://realm.io/docs/objc/latest/api/Classes/RLMRealm.html#//api/name/addOrUpdateObject: https://realm.io/docs/objc/latest/api/Classes/RLMRealm.html#//api/name/addOrUpdateObjectsFromArray:

    为了更新 Realm 中的对象,您需要在 RLMObject 子类中定义一些主键,以便 Realm 知道要更新什么。

    + (NSString *) primaryKey
    {
        return @"somePropertyNameAsString";
    }
    

    【讨论】:

    • 由于某种原因,当我尝试更新我的对象时,它会抛出一个异常,说它找不到主键。我检查了一下,我的主键等于nilPrimaryKey 应该是 RLMObject 类中的属性吗?
    【解决方案3】:

    在 Realm 中,每当您从数据库中检索对象时,您都可以更新其属性,这些更改将反映在数据库中。

    【讨论】:

    • 对此是否有任何先决条件(即:属性被标记为“动态”等)?试过这个,但更新似乎没有被持久化,即使它在一个写事务块中。
    【解决方案4】:

    这是我编写的用于更新我的数据库的方法,该数据库有一个名为 CDlevels 的表。

    您可以从任何线程调用此方法,因为它将从该线程分配领域并执行必要的操作。

    -(void)updateLevel:(int)levelNo WithScore:(NSString*)strScore complete:(void (^)(BOOL))completed{
    
    RLMRealm *realm = [RLMRealm defaultRealm];
    
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"levelNo = %d",levelNo];
    
    RLMResults *RLMLevels = [CDLevels objectsWithPredicate:pred];
    
    CDLevels *myLevel = [[CDLevels alloc]init];
    
    myLevel = [RLMLevels objectAtIndex:0];
    
    [realm beginWriteTransaction];
    myLevel.score = strScore;
    [realm commitWriteTransaction];
    
    completed(YES);
    
    }
    

    这就是你如何调用这个方法,比如用分数 100 更新级别 1

    [self updateLevel:1 WithScore:@"100" complete:^(BOOL completed) {
    
            if (completed) {
                 NSLog(@"score updated");
            }
    
        }];
    

    我尝过这个,效果很好。我正在尝试将我的一个 coredata 应用程序更改为 Realm。

    希望对您有所帮助。如果标记为答案的答案有误,请更正。

    这是一种原始的方法,我相信它可以做得更好。

    干杯

    【讨论】:

      猜你喜欢
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      相关资源
      最近更新 更多