iOS学习iOS 开发每天分享优质文章iOS学习笔记

Realm -- oc版使用(上)

2017-09-19  本文已影响130人  JasonLee宸

Realm 移动端数据库

对Realm架构更多感兴趣的可参阅以上文章,本文不做赘述。
Realm数据库 从入门到“放弃”
iOS学习笔记(11)-Realm初探
很感谢以上两篇文章的作者,对当时初识realm的我帮助很大。

Realm的安装

Realm基础使用

对于数据库,首先就是建库,建表。对比SQLite,通过一系列SQL语句完成,我们来看看realm中如何操作。

+ (void)setDefaultRealmForUser:(NSString *)username {
  RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];

  // 使用默认的目录,但是使用用户名来替换默认的文件名
  config.fileURL = [[[config.fileURL URLByDeletingLastPathComponent]
                      URLByAppendingPathComponent:username]
                      URLByAppendingPathExtension:@"realm"];

  // 将这个配置应用到默认的 Realm 数据库当中
  [RLMRealmConfiguration setDefaultConfiguration:config];
}
image.png

存储字段对应类属性

支持的数据类型有BOOL、bool、int、NSInteger、long、long long、float、double、NSString、NSDate、NSData 以及 被特殊类型标记的 NSNumber,注意:Realm不支持auto_increment类型
m文件中可设置可空属性(Optional Properties),属性特性(attributes),索引属性(Indexed Properties),属性默认值,对象的自更新特性,忽略属性。详细可见官方文档
此处仅介绍下主键(Primary Keys)
重写 [+primaryKey] 属性id 作为主键

+ (NSString *)primaryKey {
    return @"id";
}

设置主键之后,对象的更新更加高效,查询速度更快,保持唯一性。 一旦带有主键的对象被添加到 Realm 之后,该对象的主键将不可修改。

同时,RLMObject 能够借助 RLMObject 以及 RLMArray属性来和另一个 RLMObject 建立关系,一对一,一对多关系

// Dog.h
@interface Dog : RLMObject
// 其余属性声明...
@property Person *owner;
@end
//Dog.h
@interface Dog : RLMObject// 属性声明...
@end
RLM_ARRAY_TYPE(Dog) // 定义一个 RLMArray<Dog> 类型,宏创建了一个协议,从而允许 RLMArray<Dog> 语法的使用。

// Person.h
@interface Person : RLMObject// 其余的属性声明...
@property RLMArray<Dog *><Dog> *dogs;
@end

Realm数据库操作

Person *author = [[Person alloc] init];
author.name    = @“JasonLee”;
// 获取默认的 Realm 实例
RLMRealm *realm = [RLMRealm defaultRealm];

// 通过事务将数据添加到 Realm 中
[realm beginWriteTransaction];
[realm addObject:author];
[realm commitWriteTransaction];
// 在事务中删除一个对象
[realm beginWriteTransaction];
[realm deleteObject:xxx];//实例对象
[realm deleteAllObjects]; // 从 Realm 中删除所有数据
[realm commitWriteTransaction];

事务操作也可以用:

[realm transactionWithBlock:^{
  [realm deleteObject:cheeseBook];
  [realm deleteAllObjects]; 
}];
Person *author = [[Person alloc] init];
author.name    = @“JasonLee;
author.id         = @007;

// 通过 id = 007 更新
[realm beginWriteTransaction];
[Person createOrUpdateInRealm:realm withValue:author];
[realm commitWriteTransaction];

增加也可以使用该方法,如果数据库不存在该主键对象,将进行新增操作添加到数据库。

// 查询指定的 Realm 数据库
RLMRealm *xxxrealm = [RLMRealm realmWithPath:@”xxx.realm"];
 // 获得一个指定的 Realm 数据库
RLMResults *allXXX = [类名 allObjectsInRealm:xxxrealm];

条件查询: 断言+ 谓词
1.使用断言字符串查询:

RLMResults *tanDogs = [Dog objectsWhere:@"color = '棕黄色' AND name BEGINSWITH '大'"];

2.// 使用 NSPredicate 查询

NSPredicate *pred = [NSPredicate predicateWithFormat:@"color = %@ AND name BEGINSWITH %@”,@"棕黄色", @"大"];
RLMResults *tanDogs = [Dog objectsWithPredicate:pred];

Realm 在oc上的基础使用就先讲这些,下篇将继续对使用个过程中出现的问题及优化等作出讲解。感谢您提出宝贵意见。

上一篇下一篇

猜你喜欢

热点阅读