CoreData数据库简介
CoreData
是一个功能强大的数据持久化技术,位于SQLite数据库之上,不需要使用SQL语句就能对它进行操作。不过在性能方面弱于直接使用SQLite数据库。
CoreData与SQLite进行对比
SQLite
1.基于C接口,需要SQL语句,代码繁琐。
2.处理大量数据时,表关系更直观。
3.在OC中不是可视化,不易理解。
CoreData
1.可视化,且具有undo/redo能力
2.可以实现多种文件格式:
* NSSQLiteStoreType
* NSBinaryStoreType
* NSInMemoryStoreType
* NSXMLStoreType
3.苹果官方API支持,与iOS结合更紧密
使用CoreData数据库
下面我们就动手来创建一个带有CoreData数据库的工程
1.创建工程
我们创建工程的时候勾选上Use Core Data,工程会自动创建一个和项目同名的.xcdatamodeld文件就是模型文件。

2.创建实体
点开模型文件,点击下方的Add Entity按钮,可以添加一个实体,我们起名为Person。然后在Person中的Attributes面板(属性)中添加两个属性,name和age。这样我们就创建一个实体。

3.创建模型
点击Xcode菜单栏中的Editor再点击Create NSManagedObject SubClass
系统就会自动帮你创建出4个文件


这样我们就可以在项目中使用CoreData数据库了。
CoreData的结构
-
NSManagedObjectContext
对象管理上下文,处理数据与应用的交互 -
NSManagedObjectModel
被管理的数据模型,在程序中使用的模型 -
NSPersistentStoreCoordinator
持久化存储协调器,添加数据库,设置数据存储的名字,位置,存储方式 -
NSManagedObject
被管理的数据记录 -
NSFetchRequest
数据操作请求 -
NSEntityDescription
表格实体结构
下图能很好的表示出CoreData中的结构

CoreData的增删改查
写入数据
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = delegate.persistentContainer.viewContext;
Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
p.name = @"wang";
p.age = 12;
NSError *error = nil;
if ([self.context save:&error]) {
NSLog(@"%@",error.userInfo);
} else {
NSLog(@"添加成功");
}
删除数据
NSError *error = nil;
NSAsynchronousFetchRequest *request = [[NSAsynchronousFetchRequest alloc]initWithFetchRequest:[Person fetchRequest] completionBlock:^(NSAsynchronousFetchResult * _Nonnull result) {
if (result && result.finalResult.count > 0) {
//删除第一条数据
Person *p = (Person *)result.finalResult[0];
NSError *delError = nil;
[self.context deleteObject:p];
if ([self.context save:&delError]) {
NSLog(@"删除一条数据失败");
} else {
NSLog(@"成功删除第一条数据");
}
}
}];
[context executeRequest:request error:&error];
查询数据
//使用type是NSPrivateQueueConcurrencyType的context,使context具有开启新线程的能力,这样执行大量查询操作的时候就不会阻塞主线程了。
NSManagedObjectContext *backContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[backContext setPersistentStoreCoordinator:self.context.persistentStoreCoordinator];
//异步查询
NSAsynchronousFetchRequest *request = [[NSAsynchronousFetchRequest alloc]initWithFetchRequest:[Person fetchRequest] completionBlock:^(NSAsynchronousFetchResult * _Nonnull result) {
if (result) {
NSLog(@"存在%zd条数据,线程:%@",result.finalResult.count,[NSThread currentThread]);
for (Person *p in result.finalResult) {
NSLog(@"name:%@,age:%d",p.name,p.age);
}
}
}];
NSError *error = nil;
[backContext executeRequest:request error:&error];
修改数据和查询类似这里就不写了。
Demo下载:CoreData Demo
网友评论