CoreData簡介
- CoreData用于做數(shù)據(jù)的持久化.
- CoreData不是數(shù)據(jù)庫,但它可以通過數(shù)據(jù)庫或XML等方式來存儲數(shù)據(jù),在iOS平臺上CoreData只能使用SQLite來存儲數(shù)據(jù).
- CoreData通過面向?qū)ο蟮姆绞絹聿僮鲾?shù)據(jù).
- CoreData簡單,易用,性能好.
CoreData主要對象
- NSManagedObjectContext: 負(fù)責(zé)應(yīng)用和數(shù)據(jù)庫之間的交互
- NSPersistentStoreCoordinator: 添加持久化存儲庫(如SQLite),是物理數(shù)據(jù)存儲的物理文件和程序之間的聯(lián)系的橋梁.
- NSManagedObjectModel: 被管理的對象模型,對應(yīng)定義的模型文件.
- NSEntityDescription: 實(shí)體描述.
CoreData使用
創(chuàng)建初始化CoreData
//1 創(chuàng)建數(shù)據(jù)庫文件路徑
NSString *databaseFilePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/database.sqlite"];
NSURL *url = [NSURL fileURLWithPath:databaseFilePath];
//2 創(chuàng)建對象模型描述文件 描述了所儲存的對象中的屬性.
//command+n 打開新建文件界面-選擇CoreData-Data Model.
//點(diǎn)擊左下角的 Add Entity 按鈕兽间,在模型描述文件中,添加一個(gè)實(shí)體模型.
//點(diǎn)擊右下角的 Add Attribute按鈕能夠?qū)嶓w模型添加屬性正塌。然后在熟悉列表中能夠設(shè)置屬性名和類型.
//3 獲取描述文件路徑
NSURL *entityFileURL = [[NSBundle mainBundle] URLForResource:@"User" withExtension:@"momd"];
//4 通過實(shí)體描述文件 來創(chuàng)建一個(gè)實(shí)體對象
// 實(shí)體模型描述文件(定義了對象中的屬性)---> 創(chuàng)建模型對象
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:entityFileURL];
//5 創(chuàng)建數(shù)據(jù)持久化協(xié)調(diào)器(PSC)
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
//6 創(chuàng)建數(shù)據(jù)庫實(shí)體文件NSError *error = nil;
[psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];
if (error) {
NSLog(@"數(shù)據(jù)庫創(chuàng)建失敗");
} else {
NSLog(@"數(shù)據(jù)庫創(chuàng)建成功:%@", databaseFilePath);
}
//綁定context 用于數(shù)據(jù)管理
_objectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
//綁定context和協(xié)調(diào)器psc
_objectContext.persistentStoreCoordinator = psc;
插入數(shù)據(jù)
- (void)insertUser {
//使用實(shí)體描述 來創(chuàng)建CoreData的模型對象
//插入一個(gè)新的對象到對象上下文中去,按照相對應(yīng)說實(shí)體名來進(jìn)行創(chuàng)建
User *user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:_objectContext];
user.username = @"xiaoming2";
user.password = @"88888888";
user.age = @20;
//保存模型對象到數(shù)據(jù)庫中
NSError *error = nil;
[_objectContext save:&error];
if (error) {
NSLog(@"保存出錯(cuò):%@", error);
} else {
NSLog(@"保存成功");
}
}
查詢數(shù)據(jù)
- (NSArray *)fetchUserWithAge:(NSNumber *)age {
//創(chuàng)建查詢請求對象
//設(shè)置所查詢的實(shí)體對象名
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"User"];
//設(shè)置查詢條件
//謂詞
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age=%@", age];
fetchRequest.predicate = predicate;
//執(zhí)行查詢請求
NSError *error = nil;
NSArray *result = [_objectContext executeFetchRequest:fetchRequest error:&error];
//處理查詢結(jié)果
if (error) {
NSLog(@"查詢出錯(cuò):%@", error);
} else {
for (User *u in result) {
NSLog(@"name = %@, password = %@, age = %@", u.username, u.password, u.age);
}
}
return [result copy];
}
刪除數(shù)據(jù)
- (void)deleteUser {
//刪除 年齡=20的所有用戶
//查詢數(shù)據(jù)
NSArray *users = [self fetchUserWithAge:@(20)];
//刪除數(shù)據(jù)
for (User *u in users) {
[_objectContext deleteObject:u];
}
//保存更改到數(shù)據(jù)庫
BOOL saveSuccess = [_objectContext save:nil];
if (saveSuccess) {
NSLog(@"保存成功");
} else {
NSLog(@"保存失敗");
}
}
修改數(shù)據(jù)
- (void)updateUser {
//將年齡=18歲的用戶 密碼改為123456
//查詢數(shù)據(jù)
NSArray *users = [self fetchUserWithAge:@(18)];
//修改數(shù)據(jù)
for (User *u in users) {
u.password = @"123456";
}
//保存修改之后數(shù)據(jù)
BOOL saveSuccess = [_objectContext save:nil];
if (saveSuccess) {
NSLog(@"保存成功");
} else {
NSLog(@"保存失敗");
}
}