realm数据使用还是有很多方便之处的,但是使用不当的话,会觉得比较啰嗦的。
realm的数据对象RLMObject是直接连接到物理存储的数据库,修改就直接改了数据库里的数据了,也因此在对RLMObject类型的数据进行操作时,要写:
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
//do something
[realm commitWriteTransaction];
有种避免的方法就是不持有这个指向realm数据库的对象,如alloc,init实例化一个A对象,此时它没有存储到realm数据库,跟oc的对象操作是没有啥区别;但是当存储到realm数据库,且指向了这个返回的对象,或是在realm的事务里创建的对象就会直接关联到数据库。
下面这方式可以避免:按需是否持有返回的对象
+ (RLMObject *)addObjectToDB:(RLMObject *)obj {
RLMRealm *realm = [RLMRealm defaultRealm];
Class class = (RLMObject *)NSClassFromString([NSString stringWithUTF8String:object_getClassName(obj)]);
[realm beginWriteTransaction];
obj = [class createOrUpdateInRealm:realm withValue:obj];
[realm commitWriteTransaction];
return obj;
}
+ (void)deletDBObjects:(NSArray<RLMObject *> *)objs {
for (RLMObject *obj in objs) {
[self deletDBObject:obj];
}
}
+ (void)deletDBObject:(RLMObject *)obj {
RLMRealm *realm = [RLMRealm defaultRealm];
Class class = (RLMObject *)NSClassFromString([NSString stringWithUTF8String:object_getClassName(obj)]);
if (![class primaryKey]) {
return;
}
RLMObject *rlmObj = [class objectInRealm:realm forPrimaryKey:[obj valueForKey:[class primaryKey]]];
if (!rlmObj) {
return;
}
[realm transactionWithBlock:^{
[realm deleteObject:rlmObj];
}];
}
一开始的设想就是建立一个通用的方法,方便各种类型对象的操作,然后就是尽量的简化工程代码。