在学习一中用的一个方便的第三方库MagicalRecord来使用CoreData,这种方式虽然简单,易掌握,并且函数丰富。但是,相应的也不可避免的产生一些问题:
1.库中包含很多我们不需要的东西
2.无法对CoreData框架进行全面掌握,不利于学习
因此,还是需要学习自己在项目中添加和使用CoreData,步骤如下:
1.创建model:New File -> Core Data -> Data Modle
2.引入CoreData框架:Build Phases -> Link Binary With Libraries -> +
3.添加三个属性:
@property(nonatomic,strong) NSManagedObjectModel *managedObjectModel;
@property(nonatomic,strong) NSManagedObjectContext *managedObjectContext;
@property(nonatomic,strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;
4.实现这三个属性
(1)managedObjectModle:数据模型,根据第一步的模型来实现
_managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObject:[NSBundle mainBundle]]];
//我将创建的模型文件 .xcdatamodeld 放在了工程目录下面,因此bundle就是mainBundle
(2)实现persistentStoreCoordinator:存储相关类,根据model将运行时存储在managedObjectContext中的数据存储进sqlite文件
//appictionDocumentsDirectory 函数作用是获取沙盒中Document文件的路径
NSURL *storeUrl = [NSURL fileURLWithPath:[[self applictionDocumentsDirectory] stringByAppendingPathComponent:@"MyData.sqlite"]];
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
NSError *err = nil;
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&err]
(3)实现managedObjectContext:managed object 的上下文
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
完成前面几步就已经配置好了CoreData了,下面是使用CoreData
1.创建entity:选中第一步穿件的.xcdatamodeld文件 -> Add Entity ->添加属性
2.创建NSManagedObject对象:Team
Team *team = [NSEntityDescription insertNewObjectForEntityForName:@"Team" inManagedObjectContext:self.managedObjectContext];
//这一步就创建了一个新的NSManagedObject对象Team
//然后设置team对象属性
team.name = @"team1";
team.city = @"CD";
//此时对象存储在运行内存中,如果想要将其存入数据库还要下面的操作
NSError *err = nil;
[self.managedObjectContext save:&err];
3.查询数据库中的对象,使用NSFetchRequest
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityName:@"Team" inManagedObjectContext:self.managedObjectContext]];
NSError *err = nil;
NSArray *resultArr = [self.managedObjectContext executeFetchRequest:fetchRequest error:&err];