1、CoreData概述
- coreData用作数据持久化,是数据持久化的最佳方式,适合大量数据的存储和查询。
- coreData不是数据库,coreData的最终存储形式可以是SQLite、XML二进制、内存、或自定义数据类型等方式来存储数据。
- 使用coreData,需要导入CoreData框架。
2、coreData优点
- 使用coreData操作数据,无需编写任何SQL语言
- SQLite通过SQL语句操作数据,coreData使用面向对象的方式操作数据
- 能够合理管理内存,避免使用SQL的麻烦,高效
3、coreData的主要对象
- NSManagedObjectContext:管理对象的上下文,执行增删改查操作。
- NSPersistentStoreCoordinator:负责连接数据库的桥梁
- NSManagedObjectModel:数据模型文件
- NSEntityDescription:实体描述(可以理解为表)
- NSManagedObject:被管理的数据对象类型
- NSFetchRequest:数据请求(相当于执行SQL语句)
4、代码展示:
4.1 打开数据库
4.1.1 获取数据模型文件路径 (UserModel为使用CoreData创建的模型文件)
NSURL *url = [[NSBundle mainBundle]URLForResource:@"UserModel" withExtension:@"momd"];
4.1.2 根据创建的路径,将其转化为NSManagedObjectModel模型文件
NSManagedObjectModel *dataModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:url];
4.1.3 定义数据库文件的沙盒路径
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/CoreData.sqlite"];
NSLog(@"filePath is:%@",filePath);
NSURL *dbUrl = [NSURL fileURLWithPath:filePath];
4.1.4 打开数据库文件(如果数据库文件不存在,则创建新的数据库文件。若存在,则直接打开)
store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:dataModel];
[store addPersistentStoreWithType:NSSQLiteStoreType //存储数据的类型
configuration:nil
URL:dbUrl //数据库文件的地址
options:nil
error:nil];
4.1.5 初始化管理数据对象的上下文
_moContext = [[NSManagedObjectContext alloc] init];
4.1.6 设置属性,通过它管理数据对象
_moContext.persistentStoreCoordinator = store;
4.2 添加数据库
4.2.1 创建一个实体对象(插如一个user对象到user实体中),注意不能是用 alloc init方法
User *user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:_moContext];
4.2.2 设置添加内容
user.userId = @30;
user.userName = @"rose”;
UIImage *image = [UIImage imageNamed:@"123"];
//UIImagePNGRepresentation:将图片对象转化为data数据(png格式)
user.userImg = UIImagePNGRepresentation(image);
4.2.3 保存添加的内容(返回的bool值可用于判断是否成功保存)
BOOL isSave = [_moContext save:nil];
4.3 查询数据
4.3.1 创建查询请求
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User”];
4.3.2 给查询请求添加查询条件
request.predicate = [NSPredicate predicateWithFormat:@"userName LIKE 'j*' && userId > 10”];
4.3.3 执行查询操作
NSArray *users = [_moContext executeFetchRequest:request error:nil];
4.3.4 遍历查询的内容
for (User *user in users) {
NSLog(@"user name is:%@",user.userName);
NSLog(@"user id is:%@",user.userId);
}
4.4 修改数据
4.4.1 创建修改请求
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"User”];
4.4.2 设置要修改的范围(添加谓词,修改名字为rose的内容)当sql语句封装到外面时若拼接不能直接在下面的方法里面拼接,可以先将sql语句拼接成字符串,然后给他。
request.predicate = [NSPredicate predicateWithFormat:@"userName = 'rose'”];
4.4.3 执行修改请求
NSArray *roses = [_moContext executeFetchRequest:request error:nil];
4.4.4 遍历修改
for (User *user in roses) {
user.userId = @50;
}
4.4.5 保存修改的内容(返回的bool值可用于判断是否成功保存)
BOOL isSave = [_moContext save:nil];
4.5 删除数据
4.5.1 创建删除请求
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"User”];
4.5.2 执行删除(在上面可以通过设置request的predicate属性设置删除的范围)
NSArray *array = [_moContext executeFetchRequest:request error:nil];
4.5.3 遍历删除内容
for (User *user in array) {
//将数据从上下文种移除
[_moContext deleteObject:user];
}
4.5.4 保存删除操作,对真正在数据库中的文件进行删除(返回的bool值可用于判断是否成功保存)
BOOL delete = [_moContext save:nil];
4.6 异步操作--者查询
4.6.1 创建一个上下文,注意该上下文的执行操作在私有队列中
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
4.6.2 设置上下文的连接桥梁
context.persistentStoreCoordinator = store;
4.6.3 设置查询 (注意在私有线程中执行)
[context performBlock:^{
[self queryData];
}];
浙公网安备 33010602011771号