移动端iOS系统数据库之Realm(二)表的创建增删改查(多表)

2020-08-12  本文已影响0人  余鹤龄

一、使用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];

代码在这里:https://github.com/icoder20150719/Realm-

上一篇 下一篇

猜你喜欢

热点阅读