一、使用realm数据库,创建表
创建表是最简单的,创建表就是创建Model模型
image.png
创建一个Person类,继承RLMObject,给上几个属性,一张Person就建好了。
@interfacePerson:RLMObject/**姓名*/@propertyNSString*name;/**年龄*/@propertyNSNumber<RLMInt>*age;/**性别*/@propertyNSString*sex;@propertyRLMArray<Dog>*dogs;@endRLM_ARRAY_TYPE(Person)
再建一个Dog表
#import@interfaceDog:RLMObject@propertyNSString*name;@propertyNSString*color;@propertyNSString*identify;@endRLM_ARRAY_TYPE(Dog)
设置identify为主键
+(NSString*)primaryKey{return@"identify";}
建表总结:做为表对象(继承RLMObject)不能都重写setter和getter方法,这就是Realm一个不好的地方,对我们的数据有一定的侵入性,为解决这个问题,我们可以建立一个rlm对象,一个继承NSObject的对象,例如:
RLMPerson:RLMObject;Person:NSObject;
提供数据换的方式
2、创建一个数据库管理对象
#import@classRLMRealm;@interfaceDataBase:NSObject+(RLMRealm*)db;+(void)dataBaseMigration;+(BOOL)dropRealmIfNeed;@end
#import"DataBase.h"#importstaticRLMRealmConfiguration*_chdRemoteRealmCustomConfig;@implementationDataBase+(RLMRealmConfiguration*)config{staticRLMRealmConfiguration*_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];returnconfigRealm;}+(void)dataBaseMigration{//使用自定义配置的config realm进行迁移RLMRealmConfiguration*config=self.config;//配置数据版本,每次项目发布加1config.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=[[Dogalloc]init];dog1.name=@"阿黄";dog1.color=@"黄色";dog1.identify=@"001";Dog*dog2=[[Dogalloc]init];dog2.name=@"阿黑";dog2.color=@"黑色";dog2.identify=@"002";Person*p=[[Personalloc]init];p.name=@"小明";p.age=@(23);p.sex=@"男";[p.dogs addObject:dog1];[p.dogs addObject:dog2];//获取RLMRealm DB对象RLMRealm*db=[DataBasedb];//存入数据库[db beginWriteTransaction];[PersoncreateInRealm:db withValue:p];[db commitWriteTransaction];
用realm brower 打开数据库(上一篇文章有讲到如何下载)
image.png
4、数据删除
//获取RLMRealm DB对象RLMRealm*db=[DataBasedb];//查找实体RLMResults*res=[PersonallObjectsInRealm:db];//删除实体[db beginWriteTransaction];[db deleteObjects:res];[db commitWriteTransaction];
这样的写法看起来没有问题,但是打开数据库就发现了其中的问题,Dog表的数据没有删掉,这个realm数据的一个坑,删除person 对象的数据时,并不会删除关联person的dog对象,要手动删除dog
image.png
修改之后的代码
//获取RLMRealm DB对象RLMRealm*db=[DataBasedb];//查找实体RLMResults*res=[PersonallObjectsInRealm:db];//删除实体[db beginWriteTransaction];for(inti=0;i<res.count;i++){Person*p=res[i];[db deleteObjects:p.dogs];}[db deleteObjects:res];[db commitWriteTransaction];
image.png
这时能够全部数据都删除了,不会造成数据冗余。我的项目之前由于这个问题造成了血的教训。
5、查找数据
reaml提供很多的查找数据的方式
//查出全表数据
RLMRealm*db=[DataBase db];RLMResults*result=[Person allObjectsInRealm:db];for(inti=0;i<result.count;i++){Person*p=result[i];NSLog(@"%@",p);}RLMResults*DogResult=[Dog allObjectsInRealm:db];for(inti=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];
网友评论