Realm数据库是由美国YCombinator
孵化的创业团队历时几年打造的一个专门针对移动平台设计的数据库。开源,集成简单,开发学习成本低,查询效率高。但是,realm不保证线程安全性
,这个是使用过程中特别需要注意的点!
为了方便Realm文件的查看,Realm还提供了一个轻量级的数据库查看工具Realm Browser,借助这个工具,开发者可以查看数据库当中的内容,并执行简单的插入和删除操作。Realm Browser可以在App Store中下载安装。
- realm的基本对象理解:
RMObject:每一个基于RMObject创建的model类,其实相当于在数据库创建了一张新表;每一个model对象,对应数据库中的一条数据;官方建议不要加上 Objective-C的property
RLMRealm:RLMRealm类对象就是一个完整的数据库,对应在硬盘上一个数据库文件;查询操作可以直接使用 谓词 的查询语句,非常简洁方便
RLMResults:这个类是执行查询请求后所返回的类,其中包含了一系列的RLMObject对象。RLMResults和NSArray类似,我们可以用下标语法来对其进行访问,并且还可以决定它们之间的关系。不仅如此,它还拥有许多更强大的功能,包括排序、查找等等操作。 - 要点提示:当使用排序时,model的排序属性必须是数字类型,int/float等,string类型会用第一个字符排序,导致错误;RLMObject与RLMResults都有一个invalidated属性,当APP访问对象为invalidated时,会导致闪退,尤其是在多个线程访问数据库,需要频繁插入删除操作数据库时,因此对RLMResults与RLMObject对象,请务必添加invalidated属性判断,就像下标访问NSArray,必须判断数组长度,保证不越界一样重要。
RMObject最常用的:数据写入、数据删除;建议数据库的打开/提交/关闭事务使用block方式,简洁清晰,但是在block内部必须使用弱引用,防止循环引用导致页面无法释放;整个APP最好只创建一个realm数据库,防止多个数据库同时操作引起异常;
//实例化一个RLMRealm类的对象
//根据配置参数获得RLMRealm
+ (nullable instancetype)realmWithConfiguration:(RLMRealmConfiguration *)configuration error:(NSError **)error;
//根据指定持久化文件路径获得RLMRealm
该路径下如果存在数据库就取当前数据库,不存在就创建
+ (instancetype)realmWithPath:(NSString *)path;
//执行写入事务内给定块中包含的操作
- (void)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block;
//执行写入事务内给定块中包含的操作, 如果发生错误,则返回时包含NSError描述问题的对象
- (BOOL)transactionWithBlock:(__attribute__((noescape)) void(^)(void))block error:(NSError **)error;
//添加或更新一个对象
- (void)addObject:(RLMObject *)object;
//将现有对象添加或更新到Realm中, 有则更新没有则插入
这个方法要求该model对象必须有主键Primary
- (void)addOrUpdateObject:(RLMObject *)object;
//添加或更新多个对象
- (void)addObjects:(id<NSFastEnumeration>)objects;
- (void)addOrUpdateObjects:(id<NSFastEnumeration>)objects;
//删除对象
- (void)deleteObject:(RLMObject *)object;
- (void)deleteObjects:(id)array;
- (void)deleteAllObjects;
RMObject:调取所有对象建议用allObjectsInRealm方法,防止多数据库时取值错误;allObjects方法取默认数据库的值;查询条件语法
//在Realm数据库中,获取该RLMObject类的所有对象
+ (RLMResults *)allObjects;
//根据查询条件返回满足条件的所有RLMObject类的对象
+ (RLMResults *)objectsWhere:(NSString *)predicateFormat, ...;
//使用默认Realm中的给定主键检索此对象类型的单个实例
+ (nullable instancetype)objectForPrimaryKey:(nullable id)primaryKey;
//从指定的Realm返回此对象类型的所有对象
+ (nonnull RLMResults *)allObjectsInRealm:(nonnull RLMRealm *)realm;
更详细使用请推荐阅读:
Realm数据库 从入门到“放弃”