- CoreData是苹果公司提供的一种数据持久化方案或者说是框架;
- CoreData是对SQLite的一次封装,极大的简化了对数据库的操作;
- CoreData在数据的同步上采用的缓存机制,将数据首先放置到缓存区中,NSManagedObjectContext发起save操作,才会通过NSPersistentStoreCoordinate与数据交互并执行数据库操作,这样避免了因数据操作而带来的I/O操作,提高了效率;
- NSManagedObjectModel:CoreData的数据模型对象,可以理解为数据库的设计图纸;
- NSPersistentStoreCoordinate:通过NSManagedObjectModel与关联创建本地的数据库,可以理解为数据库本身;
- NSManagedObjectContext:对象托管即管理着来自数据库的对象,多会缓存这里;
//从本地加载对象模型
NSString path = [[NSBundle mainBundle] pathForResource:@"Model" ofType:@"momd"];
NSManagedObjectModel mgrmodel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path]];
//创建本地数据库(数据库协调器)
NSPersistentStoreCoordinator* coord = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mgrmodel];
path = [NSString stringWithFormat:@"%@/Documents/DB.data", NSHomeDirectory()];
[coord addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:path] options:nil error:nil];
//数据库关联到缓存区域(托管对象管理)
NSManagedObjectContext* ctxt = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
ctxt.persistentStoreCoordinator = coord;
增删改查
假设我们已经建立好的数据模型,其中已经建立了User模型,含有name,age,sex属性
数据的插入
//这里创建了对象,但是只是存放在缓存区域中
User* usr = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:ctxt];
usr.name = @"text";
usr.age = 25;
usr.sex = @"男";
//此时才将数据保存到数据中
[ctxt save:nil];
数据查询
//创建查询请求
NSFetchRequest* fetch = [[NSFetchRequest alloc] initWithEntityName:@"User"];
//查询条件
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"age=25"];
fetch.predicate = predicate;
NSArray* result = [ctxt executeFetchRequest:fetch error:nil];
分页查询
//记录当前查询页数
static NSInteger page = 0;
//每页的数量
[fetch setFetchLimit:10];
//游标,记录已经查询到的位置
[fetch setFetchOffset:page * 10];
数据更新
fetch = [[NSFetchRequest alloc] initWithEntityName:@"User"];
//查询条件
predicate = [NSPredicate predicateWithFormat:@"age=25"];
fetch.predicate = predicate;
result = [ctxt executeFetchRequest:fetch error:nil];
if ([result count] > 0)
{
//批量修改数据
[result setValue:[NSNumber numberWithInt:30] forKey:@"age"];
}
//同步到数据库中
[ctxt save:nil];
删除数据
[ctxt deleteObject:[result firstObject]];
[ctxt save:nil];
批量删除数据
fetch = [[NSFetchRequest alloc] initWithEntityName:@"User"];
NSBatchDeleteRequest* delrequest = [[NSBatchDeleteRequest alloc] initWithFetchRequest:fetch];
[coord executeRequest:delrequest withContext:ctxt error:nil];