您的位置:首页 > 移动开发 > IOS开发

IOS开发 core data  简单使用和注意

2016-07-31 23:13 309 查看



1. 创建CoreData 命名Model 

创建方式:command+N->ios/coredate->DataModel



2.生成NSManagedObject
SubClass

创建方式:command+N->ios/coredate->NSManagedObject
SubClass



3.CoreData简单使用

 CoreData常用的几个类

NSManagedObjectContext         MOC 托管对象上下文,各种操作都需要这个类
NSPersistentStoreCoordinator   PSC  持久化调度器,协调上下文和存储区区之间关系,数据库路径,数据库升级都要通过psc配置
NSManagedObjectModel           MOM 托管对象模型,对应一个模型文件,存储数据库中的数据结构
 CoreData初始化

// 初始化上下文
NSManagedObjectContext *_MainContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];

// 初始化模型文件
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

// 持久化存储调度器
NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

//设置数据库存储路径
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSLog(@"%@",doc); NSString *sqlitePath = [doc stringByAppendingPathComponent:@"company.sqlite"]; NSError *error = nil;

//当数据结构发生变化时,用户app只能升级,不能卸载重装,需要配置一下
NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
 
//数据存储的类型 数据库存储路径
       [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:sqlitePath] options:optionsDictionary error:&error]; _MainContext.persistentStoreCoordinator = store;



CoreData查询

<pre name="code" class="objc">        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

//设置查询条件
fetchRequest.predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"hxID='%@'",username]];

//设置查询结果数量为20条
[fetchRequest setFetchLimit:20];

//设置查询结果偏移量
[fetchRequest setFetchOffset:10];

//设置要查询Entity名称,上下文
NSEntityDescription *entity = [NSEntityDescription entityForName:@"HxInfo" inManagedObjectContext:cusMoc1];
[fetchRequest setEntity:entity];

//开始查询,
NSError *error;
NSArray *fetchedObjects = [cusMoc1 executeFetchRequest:fetchRequest error:&error];
if (!error) {
NSLog(@"查询到数据了");
}




CoreData插入数据

//初始化一个Entity类
NSError *error;
GroupInfoM *myGroupInfo = [NSEntityDescription insertNewObjectForEntityForName:@"HxInfo" inManagedObjectContext:_MainContext];

//给对象赋值
myGroupInfo.groupId = @"1234";
myGroupInfo.groupName = @"快乐的生活";

//保存到数据库
[cusMoc1 save:&error];

if (!error) {
NSLog(@"保存成功");
}
CoreData多线程应用
当写入和查询同时进行,尤其是同时对一个Entity进行操作时,会造成app闪退,原因是:你查询这条数据后,Entity同一条数据内容更新了

苹果官方给的解决方案,每个线程有自己独立的MOC,所有的MOC公用一个PSC
说一下是我自己项目的,新建一个主的MOC,执行异步的插入,删除,更新操作,多个子的MOC,执行查询

//从当前调用事件的线程中得到对应的NSManagedObjectContext
NSManagedObjectContext* threadContext = [[NSThread currentThread].threadDictionary objectForKey:[NSThread currentThread].name];

//第一次调用时,创建一个新的NSManagedObjectContext
if (!threadContext) {
//疑问1:NSPrivateQueueConcurrencyType这个起什么作用
threadContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];

//设置threadContext的父的MOC
[threadContext setParentContext:_MainContext];

//把threadContext放入到对应的线程中
[[NSThread currentThread].threadDictionary setObject:threadContext forKey:[NSThread currentThread].name];
}

//查询使用threadContext
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息