@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"];