realm数据库通用增、删方法

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];
    }];
}

一开始的设想就是建立一个通用的方法,方便各种类型对象的操作,然后就是尽量的简化工程代码。

推荐阅读更多精彩内容