收藏问题Realm临时收藏

iOS Realm简单使用(增删改查和排序)

2017-07-08  本文已影响410人  爱做梦的星星

文档类型: 学习笔记


最近学习Realm,还是一个非常好用的数据库,相对于Sqlite,不需要学习那么累,基本上初级使用者官方文档看完,1天就可以开发了.


Realm文章链接:

1.iOS Realm简单使用(增删改查和排序)

2.Realm存储的类型和Realm数据库关系存储制

3.Realm可空属性,默认值,忽略属性,通知

4.Realm用户机制,数据库操作,数据库迁移


Realm是一个跨平台的移动数据库引擎,支持iOS,OS X(OS Swift)和安卓.

Realm是一个基于C++的数据库而不是sqlite.


安装(最简单的方式)

pod 'Realm'

关于Realm详细的文档可以参考Realm官网

Realm数据库工具在Appstore中可以免费下载

RealmRealm

Realm插件可以通过Alcatraz,(关于iOS8以上安装插件方法见我的另一篇文章)Xcode 8+插件的安装方法

Realm Xcode插件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())

app沙盒路径app沙盒路径
使用Realm数据库工具打开
image_1bkgni2sea0n1rqj1m8v1p911ap1r.png-44.9kBimage_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.2kBimage_1bkgodi0o1iqv1h5n3o3ur91g9u2l.png-24.2kB
注:如果主键一定要一开始设置,不然会报错涉及到数据库迁移,后面说.
注:这里修改的模型一定是被Realm所管理的模型才可以
image_1bkgoi5vc1m605lvetk1pcp1l4n32.png-20.6kBimage_1bkgoi5vc1m605lvetk1pcp1l4n32.png-20.6kB
[realm transactionWithBlock:^{
    [realm addOrUpdateObject:stu];
}];

//第三种
[realm transactionWithBlock:^{
    [student createOrUpdateInRealm:realm withValue:@[@"lisi",@26]];
}];

看效果: image_1bkgo620v1vmfulkvf0u02frt28.png-25.5kBimage_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.查询数据

注意点

//上述第一点和第二点就不代码了,感兴趣试下,第三点上代码
    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-112kBimage_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];

上一篇下一篇

猜你喜欢

热点阅读