更新 Realm 中的对象
Updating an object in Realm
我应该如何更新 Realm 中的对象?似乎无法在 editing/updating 对象上找到任何内容。有任何想法吗?谢谢
您可以使用来自 RLMRealm class 的以下 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 子classes 中定义一些主键,以便 Realm 知道要更新什么。
+ (NSString *) primaryKey
{
return @"somePropertyNameAsString";
}
在 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";
}];
这是我编写的更新数据库的方法,其中有一个 table 称为 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");
}
}];
我尝过这个,效果很好。我正在尝试将我的一个核心数据应用程序更改为 Realm。
希望对您有所帮助。如果标记为答案的答案有误,请更正。
这是一个原始的方法,我相信它可以做得更好。
干杯
我应该如何更新 Realm 中的对象?似乎无法在 editing/updating 对象上找到任何内容。有任何想法吗?谢谢
您可以使用来自 RLMRealm class 的以下 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 子classes 中定义一些主键,以便 Realm 知道要更新什么。
+ (NSString *) primaryKey
{
return @"somePropertyNameAsString";
}
在 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";
}];
这是我编写的更新数据库的方法,其中有一个 table 称为 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");
}
}];
我尝过这个,效果很好。我正在尝试将我的一个核心数据应用程序更改为 Realm。
希望对您有所帮助。如果标记为答案的答案有误,请更正。
这是一个原始的方法,我相信它可以做得更好。
干杯