美文网首页Realm
Realm用户机制,数据库操作,数据库迁移

Realm用户机制,数据库操作,数据库迁移

作者: 爱做梦的星星 | 来源:发表于2017-07-09 13:13 被阅读49次

    文章类型:学习笔记


    Realm文章链接:

    1.iOS Realm简单使用(增删改查和排序)

    2.Realm存储的类型和Realm数据库关系存储制

    3.Realm可空属性,默认值,忽略属性,通知

    4.Realm用户机制,数据库操作,数据库迁移


    用户机制

    开发中会用到很多的数据库,基本上每个用户都有自己的数据库,那么Realm怎么操作呢?

    //修改Realm的默认配置
    //这里仅仅是修改文件名,也可以修改路径看需求
    - (void)setDefaultRealmForUser:(NSString *)name  {
        RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
        config.fileURL = [[[config.fileURL URLByDeletingLastPathComponent] URLByAppendingPathComponent:name] URLByAppendingPathExtension:@"realm"];
        [RLMRealmConfiguration setDefaultConfiguration:config];
    }
    
    //使用对应名字的realm来操作
    - (void)test {
        [self setDefaultRealmForUser:@"zhangsan"];
    
        RLMRealm *realm = [RLMRealm defaultRealm];
        student *stu = [[student alloc] init];
        stu.number = 99;
    
        [realm transactionWithBlock:^{
            [realm addObject:stu];
        }];
    
        [self setDefaultRealmForUser:@"wanger"];
    
        //注意修改路径配置后一定要重新获取RLMRealm,不然会直接操作上一个Realm数据库
        RLMRealm *realm2 = [RLMRealm defaultRealm];
        student *stu2 = [[student alloc] init];
        stu.number = 90;
    
        [realm2 transactionWithBlock:^{
            [realm addObject:stu2];
        }];
    }
    

    数据库操作

    仅仅想查数据库,而不能修改数据库怎么操作呢?

    //只读模式打开数据库
    - (void)readOnly {
        RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
        //获取需要打包的文件URL路径,读取置顶的数据库(可以不写)
    //    config.fileURL = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"MyBundledData" ofType:@"realm"]];
    
        //以只读的模式打开文件,这是是不能写数据的
        config.readOnly = YES;
    
        //通过配置打开Realm数据
        RLMRealm *realm = [RLMRealm realmWithConfiguration:config error:nil];
    
        //读取代码
        //code...
    }
    

    Realm数据库文件删除

    - (void)setDefaultRealmForUser:(NSString *)name  {
        RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
        config.fileURL = [[[config.fileURL URLByDeletingLastPathComponent] URLByAppendingPathComponent:name] URLByAppendingPathExtension:@"realm"];
        [RLMRealmConfiguration setDefaultConfiguration:config];
    }
    
    - (void)deleteRealmWith:(NSString *)name {
    
        //获取需要删除的数据库配置
        [self setDefaultRealmForUser:name];
        
        NSFileManager *manager = [NSFileManager defaultManager];
        RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
        NSArray<NSURL *> *realmFileURLs = @[config.fileURL,
                                            [config.fileURL URLByAppendingPathExtension:@"lock"],
                                            [config.fileURL URLByAppendingPathExtension:@"log_a"],
                                            [config.fileURL URLByAppendingPathExtension:@"log_b"],
                                            [config.fileURL URLByAppendingPathExtension:@"note"]
                                            ];
        for (NSURL *URL in realmFileURLs) {
            NSError *error = nil;
            [manager removeItemAtURL:URL error:&error];
            if (error) {
                // 处理错误
            }
        }
    }
    

    数据库迁移

    //注:数据库的迁移最好在程序加载成功就执行(didFinishLaunchingWithOptions)
    //1.获取默认配置
    RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
    
    //2.叠加版本号(要比上一次的版本号高)
    int newVersion = 1;
    config.schemaVersion = newVersion;
    
    //3.具体迁移
    [config setMigrationBlock:^(RLMMigration *migration, uint64_t oldSchemaVersion) {
        //oldSchemaVersion默认0
        //这里面无需做任何事就可以完成数据结构和数据的迁移
    
        //注当你需要将旧的字段数值迁移到新的字段或者叠加或者...那你就需要去告诉它
        if (oldSchemaVersion < newVersion) {
            NSLog(@"需要迁移");
    
            //仅仅换名称迁移
            [migration renamePropertyForClass:@"student" oldName:@"oldname" newName:@"newname"];
            
            //万能迁移
            /**
             *  便利存储类来实现数据结构迁移
             *
             *  @param NSString 对应的类
             */
            [migration enumerateObjects:@"student" block:^(RLMObject * _Nullable oldObject, RLMObject * _Nullable newObject) {
                //这里可以拿到老的数据和新的数据
                //举例1.将老数据的name数据迁移到新的newname上
                newObject[@"newname"] = oldObject[@"name"];
                //举例2.新数据的newname为老数据的new字段和name字段合集
                newObject[@"newname"] = [NSString stringWithFormat:@"%@%@",oldObject[@"new"],oldObject[@"name"]];
                //等等...
                
            //多版本迁移
            if (oldSchemaVersion < 1) {
                //迁移第一个版本
            }
            
            if (oldSchemaVersion < 2) {
                //迁移第二个版本
            }
            //等等...
            }];
        }
    }];
    
    //4.配置生效
    [RLMRealmConfiguration setDefaultConfiguration:config];
    
    //5.如果需要立即迁移(不执行的话,只有当使用RLMRealm才会执行迁移)
    [RLMRealm defaultRealm];
    

    相关文章

      网友评论

        本文标题:Realm用户机制,数据库操作,数据库迁移

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