美文网首页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用户机制,数据库操作,数据库迁移

    文章类型:学习笔记 Realm文章链接: 1.iOS Realm简单使用(增删改查和排序) 2.Realm存储的类...

  • Android基础(10)数据库

    1)如何导入外部数据库?2)数据库数据迁移问题3)数据库框架对比和源码分析 GreenDao、Realm4)sql...

  • 练手RN项目

    要点: 1、带索引的电话薄列表、单行刷新、checkbox 2、realm数据库,以及数据库迁移方案 3、redu...

  • Mysql的迁移工作总结

    Mysql数据库进行迁移操作 背景:由于之前的数据库维护比较散漫,每次进行数据库的迁移操作都会伤筋动骨的难受,所以...

  • Realm数据库迁移

    项目中用到了Realm做数据存储,在版本迭代时对存储的用户信息新增了一个属性,结果导致项目崩溃。经查阅发现本有做数...

  • Realm遇上Kotlin

    相信用过Android Realm数据库的同学享受了Realm的强大的同时,也忍受了Realm事物操作的繁琐。例如...

  • 持久化方案-Realm(三)

    Realm数据库配置 不同的用户, 使用不同的数据库文件 只读方式打开数据库 数据库文件删除 需要删除数据库文件以...

  • mysql 常用操作

    数据库用户管理 Ø 连接MySQL Ø 新增用户 Ø 修改用户密码 数据库操作 Ø查看数据库 Ø 创建数据库 Ø ...

  • shiro认证:连接数据库操作doGetAuthenticati

    5.13.1 需求修改realm的doGetAuthenticationInfo,从数据库查询用户信息,real...

  • Swift Realm数据库 本地迁移

    在我们开发中不免会遇到使用数据库的情况,如果使用swift开发并且数据库使用了Realm的时候,这篇简单的本地迁移...

网友评论

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

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