Realm

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

2017-07-09  本文已影响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];
上一篇下一篇

猜你喜欢

热点阅读