美文网首页
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操作

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