realm数据库的理论知识在[realm数据开发(一)]http://www.jianshu.com/p/76b6d08d938e 中已经将结果了,本节只对realm数据库的使用进行讲解,增、删、改、查
获取数据库路径
获取默认的数据库
+(RLMRealm *)getDefaultRealm {
defaultRealm = [RLMRealm defaultRealm];
return defaultRealm;
}
指定的自定义数据库
+(RLMRealm *)getCustomRealm{
NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *realmPath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.realm",realmName]];
RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
config.fileURL = [NSURL fileURLWithPath:path];
config.objectClasses = @[KKExamRLMModel.class,KKInquiryRLMModel.class];
config.readOnly = NO;
config.schemaVersion = realmVersion;
config.migrationBlock = ^(RLMMigration *migration , uint64_t oldSchemaVersion) { // 这里是设置数据迁移的block
if (oldSchemaVersion < realmVersion) {
}
};
[RLMRealmConfiguration setDefaultConfiguration:config];
customRealm = [RLMRealm realmWithURL:[NSURL fileURLWithPath:realmPath]];
return customRealm;
}
数据查询
/**
获取所有的数据集
@param descriptors 排序器(RLMSortDescriptor类型,不排序传nil即可)
@return 所有的数据集
*/
+(RLMResults *)getAllObjectsWithSortedDescriptors:(NSArray *)descriptors{
RLMResults *results=nil;
RLMRealm* realm=[self getCustomRealm];
if (realm) {
results=[self allObjectsInRealm:realm];
}
if (results&&descriptors) {
results=[results sortedResultsUsingDescriptors:descriptors];
}
return results;
}
/**
获取所有的数据集(适合根据单个属性进行排序)
@param keyPath 排序关键字(不排序则传传nil)
@return 所有的数据集
*/
+(RLMResults *)getAllObjectSortedByKePath:(NSString *)keyPath ascending:(BOOL)ascending {
RLMResults *results=nil;
RLMRealm* realm=[self getCustomRealm];
if (realm) {
results=[self allObjectsInRealm:realm];
}
if (results&&keyPath) {
results=[results sortedResultsUsingKeyPath:keyPath ascending:ascending];
}
return results;
}
/**
通过字符串查询(适合根据多个属性进行排序)
@param where 查询条件字符串(指定数据库需要传入数据库名字,默认数据库需要传入nil即可)
@param descriptors 排序器(RLMSortDescriptor类型,不排序传nil即可)
@return 结果集
*/
+(RLMResults *)getObjetctsWithWhere:(NSString *)where sortedDescriptors:(NSArray *)descriptors {
RLMResults *results=nil;
RLMRealm* realm=nil;
realm=[self getCustomRealm];
if (realm) {
results=[self objectsInRealm:realm where:where];
}
if (descriptors&&results) {
results=[results sortedResultsUsingDescriptors:descriptors];
}
return results;
}
/**
通过字符串查询(适合根据单个属性进行排序)
@param where 查询条件字符串(指定数据库需要传入数据库名字,默认数据库需要传入nil即可)
@param keyPath 排序关键字(不排序传nil即可)
@param ascending 是否升序排列
@return 结果集
*/
+(RLMResults *)getObjetctsWithWhere:(NSString *)where sortedByKePath:(NSString *)keyPath ascending:(BOOL)ascending {
RLMResults *results=nil;
RLMRealm* realm=nil;
realm=[self getCustomRealm];
if (realm) {
results=[self objectsInRealm:realm where:where];
}
if (keyPath&&results) {
results=[results sortedResultsUsingKeyPath:keyPath ascending:YES];
}
return results;
}
/**
通过谓词查询数据集(适合根据多个属性进行排序)
@param predicate 查询谓词
@param descriptors 排序器(RLMSortDescriptor类型,不排序传nil即可)
@return 结果集
*/
+(RLMResults *)getObjectWithPredicate:(NSPredicate *)predicate sortedDescriptors:(NSArray *)descriptors {
RLMRealm* realm=nil;
RLMResults* results=nil;
realm=[self getCustomRealm];
if (realm) {
results=[self objectsInRealm:realm withPredicate:predicate];
}
if (descriptors&&results) {
results=[results sortedResultsUsingDescriptors:descriptors];
}
return results;
}
/**
通过谓词查询数据集(适合根据单个属性进行排序)
@param predicate 查询谓词
@param keyPath 排序关键字(不排序传nil即可)
@param ascending 是否升序排列
@return 结果集
*/
+(RLMResults *)getObjectWithPredicate:(NSPredicate *)predicate sortedByKePath:(NSString *)keyPath ascending:(BOOL)ascending {
RLMRealm* realm=nil;
RLMResults* results=nil;
realm=[self getCustomRealm];
if (realm) {
results=[self objectsInRealm:realm withPredicate:predicate];
}
if (keyPath&&results) {
results=[results sortedResultsUsingKeyPath:keyPath ascending:ascending];
}
return results;
}
数据的增加和更新
/**
对数据库进行增加或者更新当个对象
@param ojbect 单个对象
@param block 解决更新属性前必须beginWriteTransaction的操作。
*/
+(void)addorUpdateWithObject:(RLMObject *)ojbect afterBlock:(void (^)(void))block {
RLMRealm* realm=nil;
realm=[self getCustomRealm];
if (realm) {
[realm beginWriteTransaction];
block();
[realm addOrUpdateObject:ojbect];
[realm commitWriteTransaction];
}
}
/**
对数据库进行增加或者更新数组集
@param objects 数据集
@param block 解决更新属性前必须beginWriteTransaction的操作。
*/
+(void)addorUpdateWithObjects:(id)objects afterBlock:(void (^)(void))block{
RLMRealm* realm=nil;
realm=[self getCustomRealm];
if (realm) {
[realm beginWriteTransaction];
block();
[realm addOrUpdateObjectsFromArray:objects];
[realm commitWriteTransaction];
}
}
/**
添加数据(不含更新)
@param object 增加或者更新的对象
*/
+(void)addSingleObject:(RLMObject *)object {
RLMRealm* realm=nil;
realm=[self getCustomRealm];
[realm transactionWithBlock:^{
[realm addObject:object];
[realm commitWriteTransaction];
}];
}
需要注意的是数据更新时候必须先beginWriteTransaction,然后改变对象的属性,所以增加afterBlock这个回调来进行处理
数据删除
/**
删除单个对象
@param object 删除对象
*/
+(void)deleteObject:(RLMObject *)object {
RLMRealm* realm=nil;
realm=[self getCustomRealm];
if (realm) {
[realm transactionWithBlock:^{
[realm deleteObject:object];
[realm commitWriteTransaction];
}];
}
}
/**
删除一组realm数据
@param objects realm对象的数组
*/
+(void)deleteObjects:(id)objects{
RLMRealm* realm=nil;
realm=[self getCustomRealm];
if (realm) {
[realm transactionWithBlock:^{
[realm deleteObjects:objects];
[realm commitWriteTransaction];
}];
}
}
/**
通过谓词删除指定数据
@param predicate 谓词
*/
+(void)deleteObjectsWithPredicate:(NSPredicate *)predicate {
RLMResults *objects = [self getObjectWithPredicate:predicate sortedDescriptors:nil];
if (objects&&objects.count>0) {
[self deleteObjects:objects];
}
}
/**
通过where字符串数据指定数据
@param where where字符串
*/
+(void)deleteObjectsWithWhere:(NSString *)where {
RLMResults *objects = [self getObjetctsWithWhere:where sortedDescriptors:nil];
NSLog(@"objectCount:%ld",objects.count);
if (objects&&objects.count>0) {
[self deleteObjects:objects ];
}
}
/**
删除数据库中的所有数据
*/
+(void)deleteAllObjects {
RLMRealm *realm=nil;
realm=[self getCustomRealm];
if (realm) {
[realm transactionWithBlock:^{
[realm deleteAllObjects];
[realm commitWriteTransaction];
}];
}
}
本文知识对realm对象的基类进行封装,[realm数据库开发(三)]http://www.jianshu.com/p/1fe59ede20d6 将对ream数据库具体对象使用增删改查的方法进行再次封装。
网友评论