持久化方案-Realm(一):基本使用

1,171 阅读2分钟

什么是Realm

Realm是一个跨平台移动数据库引擎,支持iOS、OS X(Objective-C和Swift)以及Android,核心数据引擎C++打造,并不是建立在SQLite之上的ORM, 是拥有独立的数据库存储引擎。

(一)简单的数据操作

创建数据模型,

创建的数据模型必须继承自RLMObject,可以通过initWithValue快速创建

ps: 由于Realm 在自己的引擎内部有很好的语义解释系统,所以 Objective‑C 的许多属性特性将被忽略,如nonatomic, atomic, strong, copy 和 weak 等。 因此为了避免误解,官方推荐在编写数据模型的时候不要使用任何的属性特性。
@interface Person : RLMObject
@property int num;
@property NSString *name;
@property int age;

@end
// This protocol enables typed collections. i.e.:
// RLMArray<Person *><Person>
RLM_ARRAY_TYPE(Person)

写入方式

  • 方式一

Person *person = [Person alloc]initWithValue:{@"name":@"张三",@"age":@18,@"num":@0}
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];//开启写入事务
[realm addObject:person];//添加模型对象
[realm commitWriteTransaction];//提交写入事务

  • 方式二
[realm transactionWithBlock:^{
        [realm addObject:stu];
 }];
  • 方式三
[Stu createInRealm:realm withValue:@{@"name":@"张三",@"age":@18,@"num":@0}];

更新指定模型

  • 方式一:在事务中直接更新对象
[realm beginWriteTransaction];//开启写入事务
person.name = @"李四";
[realm commitWriteTransaction];//提交写入事务

  • 方式二:根据主键进行更新
  1. 要求操作的模型, 必须实现方法+ (NSString *)primaryKey 返回主键
  2. 在事务中调用方法 [realm addOrUpdateObject:person];

或者:

[Stu createInRealm:realm withValue:@{@"num": @12, @"name": @"李四", @"age": @666}];

删除数据

删除指定的对象

删除对象必须是从realm数据库中获取的模型对象, 而不是自己创建的

RLMObject *obj = [realm objectWithClassName:@"Stu" forPrimaryKey:@2];
[realm deleteObject:stu];
删除所有对象
[realm deleteAllObjects];

查询数据

  1. 所有的查询(包括查询和属性访问)在 Realm 中都是延迟加载的,只有当属性被访问时,才能够读取相应的数据
  2. 查询结果并不是数据的拷贝:修改查询结果(在写入事务中)会直接修改硬盘上的数据。
  3. 一旦检索执行之后, RLMResults 将随时保持更新
查询所有
[Person allObjects]
条件查询
RLMResults<Person *> *persons = [Stu objectsWhere:@"name = '李四'"];
排序
[persons sortedResultsUsingProperty:@"name" ascending:YES];
链式查询

在查询结果的基础上, 进行二次查询

[persons objectsWhere:@"address beginswith '北京'"];
分页
RLMResults<Person *> *persons = [Person allObjects];
for (NSInteger i = 0; i < 5; i++) {
  Person *person = persons[i];
  }