【发布时间】:2015-03-19 17:25:13
【问题描述】:
我将如何更新 Realm 中的对象?似乎在编辑/更新对象时找不到任何东西。有任何想法吗?谢谢
【问题讨论】:
我将如何更新 Realm 中的对象?似乎在编辑/更新对象时找不到任何东西。有任何想法吗?谢谢
【问题讨论】:
这里是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 实例
您可以使用 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";
}
【讨论】:
nil。 PrimaryKey 应该是 RLMObject 类中的属性吗?
在 Realm 中,每当您从数据库中检索对象时,您都可以更新其属性,这些更改将反映在数据库中。
【讨论】:
这是我编写的用于更新我的数据库的方法,该数据库有一个名为 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。
希望对您有所帮助。如果标记为答案的答案有误,请更正。
这是一种原始的方法,我相信它可以做得更好。
干杯
【讨论】: