美文网首页
realm 的增删改查

realm 的增删改查

作者: Heikki_ | 来源:发表于2017-01-24 18:07 被阅读465次

    首先.导入Realm.framework,
    把Realm.framework 拖到"Embedded Binaries"选项中。确认Copy items if needed被选中后,点击Finish按钮;

    <h4>一、创建数据库</h4>

    这步我是在 appdelegate didFinishLaunchingWithOptions中做的

    事实上 并不用创建数据库

    //创建数据库
    - (void)creatDataBaseWithName:(NSString *)databaseName
    {
        NSArray *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *path = [docPath objectAtIndex:0];
        NSString *filePath = [path stringByAppendingPathComponent:databaseName];
        NSLog(@"数据库目录 = %@",filePath);
    
        RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
        config.fileURL = [NSURL URLWithString:filePath];
    //    config.objectClasses = @[MyClass.class, MyOtherClass.class];
        config.readOnly = NO;
        int currentVersion = 1.0;
        config.schemaVersion = currentVersion;
        
    //    config.migrationBlock = ^(RLMMigration *migration , uint64_t oldSchemaVersion) {
    //        // 这里是设置数据迁移的block
    //        if (oldSchemaVersion < currentVersion) {
    //        }
    //    };
        [RLMRealmConfiguration setDefaultConfiguration:config];
    }
    

    二、创建表

    每一个继承自RLMObject 的模型可以理解为一个表
    .h文件中

    #import <Realm/Realm.h>
    @interface RLMPt : RLMObject
    @property NSString *cName;
    @property NSString *cLevel;
    @end
    

    .m文件中

    #import "RLMPt.h"
    @implementation RLMPt
    //设置 主键
    + (NSString *)primaryKey {
        return @"cLevel";
    }
    //设置属性默认值
    + (NSDictionary *)defaultPropertyValues{
        return @{@"cname":@"测试" };
    }
    
    
    //设置忽略属性,即不存到realm数据库中
    + (NSArray<NSString *> *)ignoredProperties {
        return @[@"cLevel"];
    }
    //楼下两个属性还有些迷糊
    //一般来说,属性为nil的话realm会抛出异常,但是如果实现了这个方法的话,就只有name为nil会抛出异常,也就是说现在cover属性可以为空了
    + (NSArray *)requiredProperties {
        return @[@"cLevel"];
    }
    
    //设置索引,可以加快检索的速度
    + (NSArray *)indexedProperties {
        return @[@"ID"];
    }
    @end
    

    三、增删改查

    增.改

            RLMRealm *realm = [RLMRealm defaultRealm];
            [realm  beginWriteTransaction];
            RLMPt *pt   =   [RLMPt new];
            pt.cName    =   self.name.text;
            pt.cLevel   =   self.level.text;
      //        [ realm addObject:pt];
            [realm addOrUpdateObject:pt];
        [RLMPt createOrUpdateInRealm:realm withValue:@{@"cName": @"9", @"cLevel": @"1"}];
    
    //根据主键 决定是修改,还是增加
            [ realm commitWriteTransaction];
    

    addOrUpdateObject会去先查找有没有传入的pt相同的主键,如果有,就更新该条数据。这里需要注意,addOrUpdateObject这个方法不是增量更新,所有的值都必须有,如果有哪几个值是null,那么就会覆盖原来已经有的值,这样就会出现数据丢失的问题。
    createOrUpdateInRealm:withValue:这个方法是增量更新的,后面传一个字典,使用这个方法的前提是有主键。方法会先去主键里面找有没有字典里面传入的主键的记录,如果有,就只更新字典里面的子集。如果没有,就新建一条记录。

        RLMRealm *realm = [RLMRealm defaultRealm];
        [realm beginWriteTransaction];
        RLMResults<RLMPt *> *pt = [RLMPt allObjects];
        // 删除单条记录
            [realm deleteObject:pt[0]];
        // 删除多条记录
        //    [self.realm deleteObjects:@[pt1.pt2]];
        // 删除所有记录
        //    [realm deleteAllObjects];
        [realm commitWriteTransaction];
    

        
        RLMResults<RLMPt *> *pt = [RLMPt allObjects];
        //从默认数据库查询所有
        // 使用断言字符串查询
        //    RLMResults<RLMPt *> *pt = [RLMPt objectsWhere:@"cLevel = '1'"];
         NSLog(@"%@",pt);
    
    /* 另一个 demo 中的方法 没有进行验证
        // 使用 NSPredicate 查询
    //    NSPredicate *pred = [NSPredicate predicateWithFormat:@"color = %@ AND name BEGINSWITH %@",
    //                         @"棕黄色", @"大"];
    //    RLMResults *results = [Dog objectsWithPredicate:pred];
    //
    //    // 排序名字以“大”开头的棕黄色狗狗
    //    RLMResults<Dog *> *sortedDogs = [[Dog objectsWhere:@"color = '棕黄色' AND name BEGINSWITH '大'"] sortedResultsUsingProperty:@"name" ascending:YES];
    */
    

    注意:

    1.模型需要继承RLMObject
    2.如果是INT 类型 应使用NSNumber<RLMInt>
    3.属性类型需要对应正确 string int 不可混淆

    reason: '-[__NSCFNumber UTF8String]: unrecognized selector sent to instance 0xb000000000000473'
    

    4.修改过属性类型后,需要删除项目,重新运行.

    'Migration is required due to the following errors:
    - Property 'HSAccount.personInfoId' has been changed from 'int' to 'string'.'
    

    5.必须设置主键,否则无法更新数据

    reason: ''HSAccount' does not have a primary key and can not be updated'
    

    6.设置完主键后需要删除项目,再次运行

    reason: 'Migration is required due to the following errors:
    - Primary Key for class 'HSAccount has been added.'
    
    reason: 'Migration is required due to the following errors:
    - Property 'HSAccount.personInfoId' has been made optional.'
    

    7.主键必须是类的一个属性

    reason: 'Primary key property 'hahaha' does not exist on object 'HSAccount''
    

    参考 : http://www.jianshu.com/p/50e0efb66bdf

    相关文章

      网友评论

          本文标题:realm 的增删改查

          本文链接:https://www.haomeiwen.com/subject/sxozbttx.html