一、使用realm数据库,创建表
创建表是最简单的,创建表就是创建Model模型
创建一个Person类,继承RLMObject,给上几个属性,一张Person就建好了。
@interface Person : RLMObject
/**姓名*/
@property NSString *name ;
/**年龄*/
@property NSNumber <RLMInt> *age ;
/**性别*/
@property NSString *sex ;
@property RLMArray <Dog>*dogs;
@end
RLM_ARRAY_TYPE(Person)
再建一个Dog表
#import <Realm/Realm.h>
@interface Dog : RLMObject
@property NSString *name;
@property NSString *color;
@property NSString *identify;
@end
RLM_ARRAY_TYPE(Dog)
设置identify为主键
+(NSString *)primaryKey {
return @"identify";
}
建表总结:做为表对象(继承RLMObject)不能都重写setter和getter方法,这就是Realm一个不好的地方,对我们的数据有一定的侵入性,为解决这个问题,我们可以建立一个rlm对象,一个继承NSObject的对象,例如:
RLMPerson:RLMObject;
Person:NSObject;
提供数据换的方式
2、创建一个数据库管理对象
#import <Foundation/Foundation.h>
@class RLMRealm;
@interface DataBase : NSObject
+ (RLMRealm *)db;
+ (void)dataBaseMigration;
+ (BOOL)dropRealmIfNeed;
@end
#import "DataBase.h"
#import <Realm/Realm.h>
static RLMRealmConfiguration *_chdRemoteRealmCustomConfig;
@implementation DataBase
+ (RLMRealmConfiguration *)config {
static RLMRealmConfiguration *_config = nil;
if (!_config) {
RLMRealmConfiguration *config = [[RLMRealmConfiguration alloc] init];
//配置数据迁移的时候,如果有错误导致崩溃问题,会删除数据库重建,不会崩溃,但是数据会丢失。配置NO数据不会丢失,但是应用会崩溃
config.deleteRealmIfMigrationNeeded = YES;
NSString *configPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]stringByAppendingString:@"/config.realm"];
config.fileURL = [NSURL URLWithString:configPath];
//设置realm管理的RLMObjects,管理了那么些表,多个数据库表可以分开管理
config.objectClasses = @[NSClassFromString(@"Person"),NSClassFromString(@"Dog")];
_config = config;
}
return _config;
}
+ (RLMRealm *)db {
RLMRealm *configRealm = [RLMRealm realmWithConfiguration:self.config error:nil];
return configRealm;
}
+ (void)dataBaseMigration {
//使用自定义配置的config realm进行迁移
RLMRealmConfiguration *config = self.config;
//配置数据版本,每次项目发布加1
config.schemaVersion = 2;
config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
if (oldSchemaVersion < 2) {
}
};
}
+ (BOOL)dropRealmIfNeed {
return [[NSFileManager defaultManager] removeItemAtPath:self.config.fileURL.path error:nil];
}
@end
3、数据存取
关系:一个人可以有多只狗。
Dog *dog1= [[Dog alloc]init];
dog1.name = @"阿黄";
dog1.color = @"黄色";
dog1.identify = @"001";
Dog *dog2= [[Dog alloc]init];
dog2.name = @"阿黑";
dog2.color = @"黑色";
dog2.identify = @"002";
Person *p = [[Person alloc]init];
p.name = @"小明";
p.age = @(23);
p.sex = @"男";
[p.dogs addObject:dog1];
[p.dogs addObject:dog2];
//获取RLMRealm DB对象
RLMRealm *db = [DataBase db];
//存入数据库
[db beginWriteTransaction];
[Person createInRealm:db withValue:p];
[db commitWriteTransaction];
用realm brower 打开数据库(上一篇文章有讲到如何下载)
4、数据删除
//获取RLMRealm DB对象
RLMRealm *db = [DataBase db];
//查找实体
RLMResults *res = [Person allObjectsInRealm:db];
//删除实体
[db beginWriteTransaction];
[db deleteObjects:res];
[db commitWriteTransaction];
这样的写法看起来没有问题,但是打开数据库就发现了其中的问题,Dog表的数据没有删掉,这个realm数据的一个坑,删除person 对象的数据时,并不会删除关联person的dog对象,要手动删除dog
修改之后的代码
//获取RLMRealm DB对象
RLMRealm *db = [DataBase db];
//查找实体
RLMResults *res = [Person allObjectsInRealm:db];
//删除实体
[db beginWriteTransaction];
for (int i = 0; i<res.count; i++) {
Person *p = res[i];
[db deleteObjects:p.dogs];
}
[db deleteObjects:res];
[db commitWriteTransaction];
这时能够全部数据都删除了,不会造成数据冗余。我的项目之前由于这个问题造成了血的教训。
5、查找数据
reaml提供很多的查找数据的方式
//查出全表数据
RLMRealm *db = [DataBase db];
RLMResults *result = [Person allObjectsInRealm:db];
for (int i = 0; i<result.count; i++) {
Person *p = result[i];
NSLog(@"%@",p);
}
RLMResults *DogResult = [Dog allObjectsInRealm:db];
for (int i = 0; i<DogResult.count; i++) {
Dog *d = DogResult[i];
NSLog(@"%@",d);
}
//通过where查询条件
RLMResults *resultWhere = [Dog objectsWhere:@"identify = '001'"];
//通过主键查询
Dog *dog = [Dog objectForPrimaryKey:@"002"];
//通过预言查询
NSPredicate *pre = [NSPredicate predicateWithFormat:@"identify = '002'"];
RLMResults *resultPredicate = [[Dog allObjectsInRealm:db] objectsWithPredicate:pre];