iOS应用数据存取的常用方式有如下几种
XML属性列表 —— PList
NSKeyedArchiver 归档
Preference(偏好设置)
SQLite3
Core Data
现在我想记录以下我对core Data的认识
存在理由:苹果公司为了关照不会使用SQL数据库的程序员,而产生的,面向对象操作数据库的oc语言
Core Data简介:
Core Data 是iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据。使用Core Data框架,程序员可以很轻松有效地通过面向对象的接口管理数据
Core Data框架提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite3数据库文件中,也能够将保存在数据库中的数据还原成OC对象
在数据操作过程中,无需编写任何SQL语句
要使用Core Data,需要导入CoreData框架
NSPersistentStoreCoordinator的产生:
为了让模型对象和数据库能够连接起来,苹果公司就创建了NSPersistentStoreCoordinator这个对象,用来作为他们之间的桥梁!
[NSManagedObjectModel mergedModelFromBundles:nil];合并所有的图形化定义的Mode————–》[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]:建立持久化存储调度—————>
addPersistentStoreWithType:指定数据库文件保存的路径,如果有,直接打开,如果没有,新建在打开—————>
_sharedContext.persistentStoreCoordinator = store;获得数据库操作句柄
具体使用如下
// 1. 实例化持久化的存储
// 1.1 从Bundle中加载被管理的数据模型
NSManagedObjectModel model = [NSManagedObjectModel mergedModelFromBundles:nil];
// 1.2 实例化持久化存储调度
NSPersistentStoreCoordinator store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
…
// 1.3 添加持久化存储(SQLite)-
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];
…—————这里我们是不是可以添加持久化存储为sql数据库呢?????
// 管理对象上下文
context = [[NSManagedObjectContext alloc] init];
context.persistentStoreCoordinator = store;
NSEntityDescription insertNewObjectForEntityForName
实体(数据库的表)的描述(最开始建立数据模型时指定的实体)
实体描述,用于描述个人信息的一个对象
Context,统一负责数据库的操作
实例:
Person *p = [NSEntityDescription insertNewObjectForEntityForName:@“Person” inManagedObjectContext:context];
p.name = @“张三”;
p.age = @18;
[context save:nil];
执行查询之后
查询数据——NSFetchedResultsController
NSManagedObjectContext context = [[DataManager sharedDataManager] sharedContext];
NSFetchRequest request = [NSFetchRequest fetchRequestWithEntityName:@“Person”];
// 定义查询排序
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@“name” ascending:YES];
request.sortDescriptors = @[sort];
// 定义查询结果控制器
fetchedResultController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
[fetchedResultController performFetch:&error];
NSFetchRequest request = [NSFetchRequest fetchRequestWithEntityName:@“Person”];
request.predicate = [NSPredicate predicateWithFormat:@“%K LIKE '52' OR name CONTAINS '三'“, @“phoneNo”];
NSArray array = [_context executeFetchRequest:request error:nil];
最后,在开发中要注意
如果开发过程中,修改了数据模型,简单的办法就是将沙盒中的数据库直接删除!
否则运行会崩溃!