文档类型: 学习笔记
最近学习Realm,还是一个非常好用的数据库,相对于Sqlite,不需要学习那么累,基本上初级使用者官方文档看完,1天就可以开发了.
Realm文章链接:
Realm是一个跨平台的移动数据库引擎,支持iOS
,OS X
(OS
Swift
)和安卓
.
Realm是一个基于C++
的数据库而不是sqlite
.
安装(最简单的方式)
pod 'Realm'
关于Realm详细的文档可以参考Realm官网
Realm数据库工具在Appstore中可以免费下载
RealmRealm插件可以通过Alcatraz
,(关于iOS8以上安装插件方法见我的另一篇文章)Xcode 8+插件的安装方法
Realm Xcode插件
安装结束了,开始使用!
1.创建realm对象
//使用Realm创建对象
//导入框架
#import <Realm/Realm.h>
//继承RLMObject
@interface student : RLMObject
//对象的属性声明,注意请不要带上nonatomic,assign,strong等这样修饰的词(官方推荐避免引起奇葩错误),readonly可以但是在realm里面有新的作用,后面讲.
@property NSString *name;
@property int number;
@end
// This protocol enables typed collections. i.e.:
// RLMArray<student *><student>
// Realm中需要声明对象
RLM_ARRAY_TYPE(student)
//关于对象的模型可以安装realm官方插件
2.存储realm对象
//1.快速Realm创建对象
//第一种
student *stu = [[student alloc] initWithValue:@{@"number":@2,@"name":@"xxx"}];
//第二种(顺序是和声明的顺序一致)
student *stu = [[student alloc] initWithValue:@[@"zhangsan",@26]];
//第三种
student *stu = [[student alloc] init];
stu.name = @"网二";
stu.number = @9;
//2.存储对象(realm种存储对象一定要开启事务)
//拿到操作realm的数据库对象写入
RLMRealm *realm = [RLMRealm defaultRealm];
//第一种方法
//开启事务
[realm beginWriteTransaction];
//存储对象
[realm addObject:stu];
//提交事务
[realm commitWriteTransaction];
//第二种方法
[realm transactionWithBlock:^{
[realm addObject:stu];
}];
//第三种
[realm transactionWithBlock:^{
[student createInRealm:realm withValue:@[@"zhangsan",@26]];
}];
//注1:Realm里面没有回滚,可以通过检查error来判断是否添加成功
- (BOOL)commitWriteTransaction:(NSError **)outError;
//注2:一旦将对象存入Realm中就意味着这个对象已经被Realm管理,并且已经和磁盘上的对象进行了地址映射
查看刚刚存储的Realm对象(地址是app沙盒的Documents
目录下)
app沙盒路径(app运行时打断点,然后po NSHomeDirectory()
)
使用Realm数据库工具打开
image_1bkgni2sea0n1rqj1m8v1p911ap1r.png-44.9kB
2.更新对象
Realm种是直接在事务中更新对象
student *stu = [[student alloc] initWithValue:@[@"zhangsan",@26]];
//拿到操作realm的数据库对象
RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
[realm addObject:stu];
}];
//更新数据
//第一种
[realm transactionWithBlock:^{
stu.name = @"lisi";
}];
//第二种根据主键更新
//studen.m声明主键
image_1bkgodi0o1iqv1h5n3o3ur91g9u2l.png-24.2kB
注:如果主键一定要一开始设置,不然会报错涉及到数据库迁移,后面说.
注:这里修改的模型一定是被Realm所管理的模型才可以
image_1bkgoi5vc1m605lvetk1pcp1l4n32.png-20.6kB
[realm transactionWithBlock:^{
[realm addOrUpdateObject:stu];
}];
//第三种
[realm transactionWithBlock:^{
[student createOrUpdateInRealm:realm withValue:@[@"lisi",@26]];
}];
看效果: image_1bkgo620v1vmfulkvf0u02frt28.png-25.5kB
3.删除数据
//被删除的模型一定是要求被Realm所管理的
//第一步取出来需要删除的对象
RLMResults *results = [student objectsWhere:@"number = 26"];
student *lisi = results.firstObject;//这里就存了一个对象
//删除单条数据
[realm transactionWithBlock:^{
[realm deleteObject:lisi];
}];
//根据主键删除模型
student *stuDelete = [student objectInRealm:realm forPrimaryKey:@26];
[realm transactionWithBlock:^{
[realm deleteObject:stuDelete];
}];
//删除1张模型表数据
RLMResults *stuResult = [student allObjects];
for (student *stu in stuResult) {
[realm transactionWithBlock:^{
[realm deleteObject:stu];
}];
}
//删除所有的模型数据(慎用)
[realm deleteAllObjects];
4.查询数据
注意点
- 1.所有的查询(包括查询和属性访问)在Realm中都是延迟加载的,只有当属性被访问的时候,才能够读取相应的属性,所有可以直接搜大量数据,结果中也仅仅是数据对应本地的地址而已.
- 2.查询的结果并不是数据的拷贝而是对应数据地址的映射:修改查询的结果(在写入事务中)会直接修改硬盘上的数据.
- 3.一旦检索执行之后,RLMResults将随时保持更新
//上述第一点和第二点就不代码了,感兴趣试下,第三点上代码
student *stu = [[student alloc] initWithValue:@{@"number":@26,@"name":@"lisi"}];
RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
[realm addObject:stu];
}];
RLMResults *results = [student allObjects];
NSLog(@"%@",results);
student *stu2 = [[student alloc] initWithValue:@{@"number":@23,@"name":@"lisi111"}];
[realm transactionWithBlock:^{
[realm addObject:stu2];
}];
NSLog(@"%@",results);
打印结果:
image_1bkh4gmmi1o0j1v6skkq9hbfpk3f.png-112kB// 1.查询所有类对象
RLMResults *results = [student allObjects];
// 2.主键查询
student *stu = [student objectInRealm:realm forPrimaryKey:@26];
// 3.非主键查询
RLMResults *results = [student objectsWhere:@"number = 26"];
// 4.在结果的子集继续查
RLMResults *results = [student allObjects];
[results objectsWhere:@"number > 0"];
//可以一直查
// 5.如果你要查从第7条之后10条
// 解决:RLMResults *results = [student allObjects];
// 直接查出所有然后for循环便利,不用担心内存炸了,它的结果仅仅是地址映射而已,上述已将
//等等
排序结果集
/**
* 结果集升序降序
*
* @param NSString 按照哪个字段排列
*
* @param ascending YES升序
*
* @return 排序后的结果集
*/
[results sortedResultsUsingKeyPath:@"number" ascending:YES];
网友评论