一、概念
1.Core Data 是数据持久化存储的最佳方式
2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型
在Mac OS X 10.5Leopard及以后的版本中,开发者也可以通过继承NSPersistentStore类以创建自定义的存储格式
3.好处:能够合理管理内存,避免使用sql的麻烦,高效
4.构成:
(1)NSManagedObjectContext(被管理的数据上下文)
操作实际内容(操作持久层)
作用:插入数据,查询数据,删除数据
(2)NSManagedObjectModel(被管理的数据模型)
数据库所有表格或数据结构,包含各实体的定义信息
作用:添加实体的属性,建立属性之间的关系
操作方法:视图编辑器,或代码
(3)NSPersistentStoreCoordinator(持久化存储助理)
相当于数据库的连接器
作用:设置数据存储的名字,位置,存储方式,和存储时机
(4)NSManagedObject(被管理的数据记录)
相当于数据库中的表格记录
(5)NSFetchRequest(获取数据的请求)
相当于查询语句
(6)NSEntityDescription(实体结构)
相当于表格结构
(7)后缀为.xcdatamodeld的包
里面是.xcdatamodel文件,用数据模型编辑器编辑
编译后为.momd或.mom文件
5.依赖关系
二、基于SQLite数据库时,Core Data的简单使用
1 创建project
添加framework coredata.framework
2 创建mod文件
3创建实例
Person 相当于表名
age 是表中字段,可以设定数据类型
relationship 关联其他表
4 创建model
三 代码举例
(1)appdelegate
初始化managedObjectContext,managedObjectModel,persistentStoreCoordinator,如果创建工程的时候勾选了coredata,那么以下代码会自动生成
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;
@end
@implementation AppDelegate
@synthesize managedObjectContext = __managedObjectContext;
@synthesize managedObjectModel = __managedObjectModel;
@synthesize persistentStoreCoordinator = __persistentStoreCoordinator;
- (void)saveContext
{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}
- (NSURL *)applicationDocumentsDirectory
{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
- (NSManagedObjectContext *)managedObjectContext
{
if (__managedObjectContext != nil) {
return __managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
__managedObjectContext = [[NSManagedObjectContext alloc] init];
[__managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return __managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel
{
if (__managedObjectModel != nil) {
return __managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"coredataOne" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return __managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (__persistentStoreCoordinator != nil) {
return __persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"coredataOne.sqlite"];
NSError *error = nil;
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return __persistentStoreCoordinator;
}
(2)增删改查例子
- (IBAction)add:(id)sender {
Person *mPerson = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:defaultContext];
mPerson.firstname = @"Li";
mPerson.age = @17;
NSError *error;
if (![defaultContext save:&error]) {
NSLog(@"%@",[error userInfo]);
}
}
- (IBAction)delete:(id)sender {
Person *mPerson = [self qury];
[defaultContext deleteObject:mPerson];
NSError *error;
if (![defaultContext save:&error]) {
NSLog(@"%@",[error userInfo]);
}
}
- (IBAction)update:(id)sender {
Person *mPerson = [self qury];
mPerson.firstname = @"Huang";
mPerson.age = @16;
NSError *error;
if (![defaultContext save:&error]) {
NSLog(@"%@",[error userInfo]);
}
}
- (IBAction)search:(id)sender {
Person *mPerson = [self qury];
NSLog(@"%@",mPerson.firstname);
}
- (Person *)qury
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
// 设置要查询的实体
request.entity = [NSEntityDescription entityForName:@"Person"
inManagedObjectContext:defaultContext];
// 设置排序(按照age降序)
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];
request.sortDescriptors = [NSArray arrayWithObject:sort];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstname = ‘%@‘", @"Li"];
request.predicate = predicate;
// 执行请求
NSError *error = nil;
NSArray *objs = [defaultContext executeFetchRequest:request error:&error];
if (error) {
[NSException raise:@"查询错误" format:@"%@", [error localizedDescription]];
}
// 遍历数据
for (Person *obj in objs) {
NSLog(@"firstname=%@", obj.firstname);
}
if ([objs count]) {
Person *mperson = objs[0];
return mperson;
}
return nil;
}
四 查看数据库
1 sqlite路径 路径appdelte里面storeUrl
2 使用coredata会生成三个文件 sqlite,shm,wal
3 在decument里面打开sqlite文件,可查看表
部分内容参照月光的尽头 博客,http://www.cnblogs.com/xiaodao/archive/2012/10/08/2715477.html
转载请注明出处