Realm操作

2019-07-20  本文已影响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"];
上一篇下一篇

猜你喜欢

热点阅读