美文网首页
Realm操作

Realm操作

作者: 马上就来 | 来源:发表于2019-07-20 17:55 被阅读0次

@ObjcMember

对所有的类使用objc推断 使其可以使用runtime运行机制

Realm操作

realm是独立的C++实现的数据库
跨平台的移动数据库引擎

realm的Xcode插件 编译插件生成 ModelObject文件模板
realm更新数据需要进行版本增加
下载realm数据库查看本地数据内容 默认在Document文件夹中保存

简单数据库操作

1.获取defalt realm
2.使用模板创建类并初始化
3.使用事务提交存储内容

   [realm transactionWithBlock:^{
        [realm addObject:stu];
    }];

4.快速创建并添加

[Stu createInRealm:realm withValue:@{@"num":@2,@"name":@"土豆"}];

模型已经被realm管理 并进行了地址映射

5.模型更新 必须是被管理的模型 必须有主键

addOrUpdateObject

判断主键来执行更新或者添加操作

6.删除对象 必须realm所管理的

 [realm deleteObject: results.firstObject];

通过主键找到元素

 [Stu objectInRealm:realm forPrimaryKey:@(2)];

7.查询
所有的查询都是懒加载 只是地址指针

RLMResults *stuRes = [Stu allObjects];

查询的结果并不是数据拷贝 修改会直接修改硬盘上的数据 一旦检索执行之后 RLMResults将随时保持更新
可以使用不同的查询方式
+ (RLMResults *)objectsWhere:(NSString *)predicateFormat
8.排序
[stuRes sortedResultsUsingKeyPath:@"num" ascending:true]
9.链式查询

   RLMResults<Stu *> *res1 = [Stu objectsWhere:"num > 1"];
    
    RLMResults<Stu *> *res2 = [res1 objectsWhere:"num > 2"];

10.分页
select * from Stu limit 3,3 第一个跳过几条 第二个参数取几条
使用for 循环进行分页

  for (int i = 3; i <= 6; i++) {
        Stu *stu = stuRes[i];
    }

支持的数据类型

1.Int
2.NSString
3.基本数据类型
4.NSData 不支持UIImage 使用readonly忽略值
5.不支持集合 可以使用RLMArray 属性必须继承与RLMObject

关系

1.对一关系
@property RLMArray<Dog *><Dog> *pets;
必须使用这种格式才可以

2.反向关系
使用readonly的连接关系

@property (readonly) RLMLinkingObjects *person;
//在.m实现反向连接的主类
+(NSDictionary<NSString *,RLMPropertyDescriptor *> *)linkingObjectsProperties {
    return @{@"person":[RLMPropertyDescriptor descriptorWithClass:NSClassFromString(@"Person") propertyName:@"pets"]};
}

然后通过他的属性取到值

3.可空属性
如果属性不写有一个默认值

//非空属性
+(NSArray<NSString *> *)requiredProperties 
//默认属性
+ (NSDictionary *)defaultPropertyValues
//忽略属性
+ (NSArray *)ignoredProperties

也可以借助readonly

数据库通知

接受修改并刷新 在CoreData中使用NSFetchedResultsController
Realm会在每次写入事务提交后 给其他线程的realm发送通知

     RLMNotificationToken *token = [realm addNotificationBlock:^(RLMNotification  _Nonnull notification, RLMRealm * _Nonnull realm) {
         NSLog(@"监听到修改通知");
    }];
    self.token = token;
    RLMResults *result = [Cat allObjects];
   self.token2 = [result addNotificationBlock:^(RLMResults * _Nullable results, RLMCollectionChange * _Nullable change, NSError * _Nullable error) {
        
    }];    

token必须持有

数据迁移

1.用户机制
不同的用户使用不同的数据库
通过配置不同的数据库配置进行调用default进行不同数据库的创建
2.只读数据库
readOnly = YES;
数据迁移适用于更改模型
数据结构的迁移 数据的迁移
3.表结构迁移 多版本增量式迁移

     RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
//     设置版本号比上一次加一
    
    int newVersion = 2;
    config.schemaVersion = newVersion;
//    具体迁移
    [config setMigrationBlock:^(RLMMigration * _Nonnull migration, uint64_t oldSchemaVersion) {
        
        if (oldSchemaVersion < newVersion) {
            NSLog(@"需要做迁移");
              [migration enumerateObjects:@"Migration" block:^(RLMObject * _Nullable oldObject, RLMObject * _Nullable newObject) {
                newObject[@"fullname"] = [NSString stringWithFormat:@"%@%@",oldObject[@"name"],oldObject[@"age"]];
        }
    }];
//    配置生效
    [RLMRealmConfiguration setDefaultConfiguration:config];
//    如果立即生效 需要访问
    [RLMRealm defaultRealm];

4.属性改名
在block中进行更名

            [migration renamePropertyForClass:@"Migration" oldName:@"fullname" newName:@"fullname2"];

相关文章

  • Realm操作

    @ObjcMember 对所有的类使用objc推断 使其可以使用runtime运行机制 Realm操作 realm...

  • Realm遇上Kotlin

    相信用过Android Realm数据库的同学享受了Realm的强大的同时,也忍受了Realm事物操作的繁琐。例如...

  • Realm学习笔记(二)——简单使用

    目录前期准备知识Realm模型写入操作读操作 前期准备知识 介绍 在这之前我们需要先记住一个类,它就是Realm类...

  • 仅作为Realm学习的笔记

    一些工具等 我的是在Mac上操作!慢慢更新!Realm 官网Realm 提供的可视化操作界面 安装插件 点击下载安...

  • Realm的操作

    简介   Realm是跨平台的移动数据库引擎,支持ios,android平台,支持oc、swift、java、RN...

  • Realm Objective-C 数据库操作

    今天研究了一下Realm数据库,觉得特别厉害哈。Realm支持iOS,OS X,Android,速度快,操作相对来...

  • Realm数据库存储 使用详解

    文章目录 一 Realm 框架 概念介绍 开发辅助工具 二 Realm 使用教程 1 简单的数据操作 创建数据模型...

  • Realm 隐蔽的跨线程问题

    Realm 文档介绍,同一个 Realm 实例,可以被任意线程访问,即能够在任意线程进行写操作,写事务被包裹在 b...

  • 进阶Realm

    在前面的篇章《Realm的CRUD》介绍了怎么最简单的把Realm给用起来,并通过一个Demo演示了CRUD的操作...

  • realm简单操作介绍

    realm是跨平台开发,使用C++编写,并是不对sqlite的封装,是有独立的数据库存储引擎.比sqlite和co...

网友评论

      本文标题:Realm操作

      本文链接:https://www.haomeiwen.com/subject/wtbulctx.html