接上篇。。。

4. 可空属性&默认值&忽略属性

默认情况下, 属性值可空, 如果强制要求某个属性非空, 可以使用如下方法:

遵循协议方法

+ (NSArray *)requiredProperties {

return @[@"name"];

}

特点:如果再次赋值为nil, 则会抛出异常错误

也可以设置默认值

+ (NSDictionary *)defaultPropertyValues {

return @{@"name": @""};

}

忽略属性:不想存储的某些属性,其实现方法为

+ (NSArray *)ignoredProperties

开发经验:

可以借助忽略属性&只读属性 打造计算属性, 完成集合以及UIImage对象的存储与获取

5. 通知

Realm 实例将会在每次写入事务提交后,给其他线程上的 Realm 实例发送通知

5.1. 获取 Realm 通知

token = [realm addNotificationBlock:^(NSString *notification, RLMRealm * realm) {

// 接收到更改通知, 需要做的事情

}];

5.2. 移除通知

[token stop];

注意:必须持有返回的token

6. Realm数据库

实现方案

不同的用户, 使用不同的数据库

 + (void)setDefaultRealmForUser:(NSString *)username {

    RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];

     // 使用默认的目录,但是使用用户名来替换默认的文件名

    config.fileURL= [[[config.fileURL URLByDeletingLastPathComponent]  URLByAppendingPathComponent:username]

                      URLByAppendingPathExtension:@"realm"]]];

     // 将这个配置应用到默认的 Realm 数据库当中

     [RLMRealmConfiguration setDefaultConfiguration:config];

 }

只读方式打开数据库

RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];

 // 获取需要打包文件的 URL 路径

 config.fileURL = [[NSBundle mainBundle] URLForResource:@"MyBundledData" withExtension:@"realm"];

 // 以只读模式打开文件,因为应用数据包并不可写

 config.readOnly = YES;

 // 通过配置打开 Realm 数据库

 RLMRealm *realm = [RLMRealm realmWithConfiguration:config error:nil];

 // 从打包的 Realm 数据库中读取某些数据

 RLMResults<Dog *> *dogs = [Dog objectsInRealm:realm where:@"age > 5"];

数据库文件删除

注意: 需要删除数据库文件以及辅助文件

代码实战:

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) {

    // 处理错误

  }

}

7. 数据库迁移

适用于修改了数据模型的情况,这里分 数据结构迁移 以及 数据迁移 属性重命名 多版本增量式迁移 四个模块分别进行说明。

  • 数据结构迁移
// 在 [AppDelegate didFinishLaunchingWithOptions:] 中进行配置

RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];

// 设置新的架构版本。这个版本号必须高于之前所用的版本号(如果您之前从未设置过架构版本,那么这个版本号设置为 0)

config.schemaVersion = ;

// 设置闭包,这个闭包将会在打开低于上面所设置版本号的 Realm 数据库的时候被自动调用

config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {

  // 目前我们还未进行数据迁移,因此 oldSchemaVersion == 0

  if (oldSchemaVersion < ) {

// 什么都不要做!Realm 会自行检测新增和需要移除的属性,然后自动更新硬盘上的数据库架构

};

  }

// 告诉 Realm 为默认的 Realm 数据库使用这个新的配置对象

[RLMRealmConfiguration setDefaultConfiguration:config];

// 现在我们已经告诉了 Realm 如何处理架构的变化,打开文件之后将会自动执行迁移

[RLMRealm defaultRealm];
  • 数据迁移
// enumerateObjects:block: 方法遍历了存储在 Realm 文件中的每一个“Person”对象

[migration enumerateObjects:Person.className block:^(RLMObject *oldObject, RLMObject *newObject) {

// 将名字进行合并,存放在 fullName 域中

      newObject[@"fullName"] = [NSString stringWithFormat:@"%@ %@", oldObject[@"firstName"], oldObject[@"lastName"]];

    }];
  • 属性重命名

[migration renamePropertyForClass:Person.className oldName:@"yearsSinceBirth" newName:版本0

  • 多版本增量式迁移

假设有如下3个数据库版本:


版本0
       // v0

        @interface Person : RLMObject

        @property NSString *firstName;

        @property NSString *lastName;

        @property int age;

        @end

版本1

        // v1

        @interface Person : RLMObject

        @property NSString *fullName; // 新属性

        @property int age;

         @end
版本2 // v2 @interface Person : RLMObject @property NSString *fullName; @property NSString *email; // 新属性 @property int age; @end

迁移核心代码

if (oldSchemaVersion < ) { 

      newObject[@"fullName"] = [NSString stringWithFormat:@"%@ %@",

oldObject[@"firstName"],  oldObject[@"lastName"]];

}

// 只有当 Realm 数据库的架构版本为 0 的时候,才添加 “fullName” 属性

 [migration enumerateObjects:Person.className

block:^(RLMObject *oldObject, RLMObject *newObject) {

         if (oldSchemaVersion < ) {

newObject[@"email"] = @"";

  }
}];

Realm数据持久化方案的简单介绍和使用(二)的更多相关文章

  1. iOS: 数据持久化方案

    数据持久化方案(如果总结不到位,或者有误的地方,敬请斧正) 一.功能: 主要是将数据持久化到本地,减少对网络请求的次数,既节省了用户的流量,也增强了App的体验效果. 二.种类:  plist存储:使 ...

  2. iOS之数据持久化方案

    概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...

  3. iOS中几种数据持久化方案

    概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...

  4. iOS中几种数据持久化方案:我要永远地记住你!

    http://www.cocoachina.com/ios/20150720/12610.html 作者:@翁呀伟呀 授权本站转载 概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启 ...

  5. redis的数据持久化方案

    Redis的持久化方案有两种 1.Rdb方式:快照形式,定期将内存中的数据持久化到硬盘.是Redis默认的数据持久化的形式. Rdb:缺点是:数据还没有更新到磁盘上,突然断电,造成数据的不完整性. 在 ...

  6. ios数据持久化--CoreData框架的介绍和使用

    1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型 在Mac OS X 10.5Leopard及以后的版本中 ...

  7. iOS开发数据持久化技术02——plist介绍

    有疑问的请加qq交流群:390438081 我的QQ:604886384(注明来意) 微信:niuting823 1. 简单介绍:属性列表是一种xml格式的文件.扩展名.plist: 2. 特性:pl ...

  8. K8S学习笔记之Kubernetes数据持久化方案

    在开始介绍k8s持久化存储前,我们有必要了解一下k8s的emptydir和hostpath.configmap以及secret的机制和用途. 0x00 Emptydir EmptyDir是一个空目录, ...

  9. react-native AsyncStorage 数据持久化方案

    1,AsyncStorage介绍 AsyncStorage 是一个简单的.异步的.持久化的 Key-Value 存储系统,它对于 App 来说是全局性的.它用来代替 LocalStorage. 由于它 ...

随机推荐

  1. DataTable && SqlDataReader帮助理解小程序

    // 2015/07/08 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  2. BZOJ 3299: [USACO2011 Open]Corn Maze玉米迷宫(BFS)

    水题一道却交了4次QAQ,真是蒟蒻QAQ CODE: #include<cstdio>#include<iostream>#include<cstring>#inc ...

  3. iOS开发学习路径的一些建议

    结合自己情况聊下iOS学习建议,这里不讲大道理,说说具体怎么做.欢迎大家拍砖. 1.第一点要求 ,能比较顺畅的阅读官方的文档 如果你连官方的文档读起来都非常困难,那你还谈什么提高和进阶,咱们学习iOS ...

  4. 漂亮的代码2:遍历文件夹目录,使用promise

    看到一个问题: 找到文件夹下所有文件: 自己写了一个: function walk(dir, ext, callback) { ext = ext.charAt(0) === "." ...

  5. MySQL逻辑备份利器-mydumper

    关于mydumper的简介和下载请访问:https://launchpad.net/mydumper 简言之,mydumper是多线程逻辑备份,对于表和数据量很大的情况下,建议使用mydumper提高 ...

  6. C#之系统异常处理机制

    在系统开发过程中,BUG和异常产生是无处不在的,但是需要我们去做的就是不断去发掘异常.修改异常. 这篇文章主要谈谈我在系统中解决异常的几种方法: 1.控制台程序产生的异常: 在大多数的控制台程序中,运 ...

  7. 规范 : loading display & ui-view loading

    angular 没有compile 完成的接口,最像的接口是$viewContentLoaded(router ui),但是一开始会开始跑,因为有ui-view 暂时解决方法是在body的loadin ...

  8. 谈谈事件对象-event

    JavaScript 中的事件对象(event) 当我们每次触发一种事件(如点击事件),我们会在回调函数中传入事件对象event.今天就来来谈谈. 1.当我们想判断当前事件是我们想要的事件类型时,可以 ...

  9. SQL Server-聚焦深入理解死锁以及避免死锁建议(三十三)

    前言 终于进入死锁系列,前面也提到过我一直对隔离级别和死锁以及如何避免死锁等问题模棱两可,所以才鼓起了重新学习SQL Server系列的勇气,本节我们来讲讲SQL Server中的死锁,看到许多文章都 ...

  10. 转:js中cookie的使用详细分析

    cookie机制将信息存储于用户硬盘,因此可以作为全局变量,这是它最大的一个优点.它可以用于以下几种场合. (1)保存用户登录状态.例如将用户id存储于一个cookie内,这样当用户下次访问该页面时就 ...