Realm用户机制,数据库操作,数据库迁移
2017-07-09 本文已影响49人
爱做梦的星星
文章类型:学习笔记
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];