首先.导入Realm.framework,
把Realm.framework 拖到"Embedded Binaries"选项中。确认Copy items if needed被选中后,点击Finish按钮;
<h4>一、创建数据库</h4>
这步我是在 appdelegate didFinishLaunchingWithOptions中做的
事实上 并不用创建数据库
//创建数据库
- (void)creatDataBaseWithName:(NSString *)databaseName
{
NSArray *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [docPath objectAtIndex:0];
NSString *filePath = [path stringByAppendingPathComponent:databaseName];
NSLog(@"数据库目录 = %@",filePath);
RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
config.fileURL = [NSURL URLWithString:filePath];
// config.objectClasses = @[MyClass.class, MyOtherClass.class];
config.readOnly = NO;
int currentVersion = 1.0;
config.schemaVersion = currentVersion;
// config.migrationBlock = ^(RLMMigration *migration , uint64_t oldSchemaVersion) {
// // 这里是设置数据迁移的block
// if (oldSchemaVersion < currentVersion) {
// }
// };
[RLMRealmConfiguration setDefaultConfiguration:config];
}
二、创建表
每一个继承自RLMObject 的模型可以理解为一个表
.h文件中
#import <Realm/Realm.h>
@interface RLMPt : RLMObject
@property NSString *cName;
@property NSString *cLevel;
@end
.m文件中
#import "RLMPt.h"
@implementation RLMPt
//设置 主键
+ (NSString *)primaryKey {
return @"cLevel";
}
//设置属性默认值
+ (NSDictionary *)defaultPropertyValues{
return @{@"cname":@"测试" };
}
//设置忽略属性,即不存到realm数据库中
+ (NSArray<NSString *> *)ignoredProperties {
return @[@"cLevel"];
}
//楼下两个属性还有些迷糊
//一般来说,属性为nil的话realm会抛出异常,但是如果实现了这个方法的话,就只有name为nil会抛出异常,也就是说现在cover属性可以为空了
+ (NSArray *)requiredProperties {
return @[@"cLevel"];
}
//设置索引,可以加快检索的速度
+ (NSArray *)indexedProperties {
return @[@"ID"];
}
@end
三、增删改查
增.改
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
RLMPt *pt = [RLMPt new];
pt.cName = self.name.text;
pt.cLevel = self.level.text;
// [ realm addObject:pt];
[realm addOrUpdateObject:pt];
[RLMPt createOrUpdateInRealm:realm withValue:@{@"cName": @"9", @"cLevel": @"1"}];
//根据主键 决定是修改,还是增加
[ realm commitWriteTransaction];
addOrUpdateObject会去先查找有没有传入的pt相同的主键,如果有,就更新该条数据。这里需要注意,addOrUpdateObject这个方法不是增量更新,所有的值都必须有,如果有哪几个值是null,那么就会覆盖原来已经有的值,这样就会出现数据丢失的问题。
createOrUpdateInRealm:withValue:这个方法是增量更新的,后面传一个字典,使用这个方法的前提是有主键。方法会先去主键里面找有没有字典里面传入的主键的记录,如果有,就只更新字典里面的子集。如果没有,就新建一条记录。
删
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
RLMResults<RLMPt *> *pt = [RLMPt allObjects];
// 删除单条记录
[realm deleteObject:pt[0]];
// 删除多条记录
// [self.realm deleteObjects:@[pt1.pt2]];
// 删除所有记录
// [realm deleteAllObjects];
[realm commitWriteTransaction];
查
RLMResults<RLMPt *> *pt = [RLMPt allObjects];
//从默认数据库查询所有
// 使用断言字符串查询
// RLMResults<RLMPt *> *pt = [RLMPt objectsWhere:@"cLevel = '1'"];
NSLog(@"%@",pt);
/* 另一个 demo 中的方法 没有进行验证
// 使用 NSPredicate 查询
// NSPredicate *pred = [NSPredicate predicateWithFormat:@"color = %@ AND name BEGINSWITH %@",
// @"棕黄色", @"大"];
// RLMResults *results = [Dog objectsWithPredicate:pred];
//
// // 排序名字以“大”开头的棕黄色狗狗
// RLMResults<Dog *> *sortedDogs = [[Dog objectsWhere:@"color = '棕黄色' AND name BEGINSWITH '大'"] sortedResultsUsingProperty:@"name" ascending:YES];
*/
注意:
1.模型需要继承RLMObject
类
2.如果是INT
类型 应使用NSNumber<RLMInt>
3.属性类型需要对应正确 string int 不可混淆
reason: '-[__NSCFNumber UTF8String]: unrecognized selector sent to instance 0xb000000000000473'
4.修改过属性类型后,需要删除项目,重新运行.
'Migration is required due to the following errors:
- Property 'HSAccount.personInfoId' has been changed from 'int' to 'string'.'
5.必须设置主键,否则无法更新数据
reason: ''HSAccount' does not have a primary key and can not be updated'
6.设置完主键后需要删除项目,再次运行
reason: 'Migration is required due to the following errors:
- Primary Key for class 'HSAccount has been added.'
reason: 'Migration is required due to the following errors:
- Property 'HSAccount.personInfoId' has been made optional.'
7.主键必须是类的一个属性
reason: 'Primary key property 'hahaha' does not exist on object 'HSAccount''