一直以來只知道iOS存儲的四種方法,常用的也是NSUserDefault和Coredata。前者使用自不必說。這裡只對Coredata的簡單用法做個小結。供初學者參考。
本文將通過一個小demo,來展示coredata基本的使用:對數據的存儲,和增刪改查等行為。
首先我們要確定兩個對象的關系
一個family家庭有多個成員member,而一個member只屬於一個家庭。
1.我們首先創建一個項目,勾選Use Core Data選項
2.在.xcdatamodel文件中,創建兩個實體,Family和Member
3.建立兩個實體之間的聯系,Type代表兩個實體之間的關系,To Many表示一個family可以對應多個Member對象,而members屬性就是這些Member 對象的集合;
這裡還有一個重要的點就是Delete Rule,DeleteRule的四個選項中:
Deny 可以拒絕刪除請求
Nullify 在刪除對象之前重設逆向關系,當刪除對象family之後,他的下屬成員member仍然在數據庫中獨立存在,只是在數據庫中member對應的family為null。
Cascade 刪除對象及它的所有關系(級聯刪除),當刪除一個family對象時,所有與他關聯的member對象也會同時被刪除
No Action 將保證一個關系所指向的對象不受影響,即使這些對象指向了即將被刪除的項
4.默認情況下,利用CZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcmUgRGF0Ycihs/a1xMq1zOW2vMrHTlNNYW5hZ2VkT2JqZWN0wODQzbXEo6zE3Lm7wPvTw7z8Lda1ttTAtLTmyKHK/b7doaO1q8rH0ruw48fpv/bPwqOsyrXM5dTatObIocr9vt21xLv5tKHJz6Os09DKsbu50OjSqsztvNPSu9Cp0rXO8be9t6jAtM3qs8nSu9CpxuTL+8jOzvGjrMTHw7S+zbHY0Ou0tL2oTlNNYW5hZ2VkT2JqZWN0tcTX08Dgo6w8YnIgLz4NCjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20160416/20160416091349228.png" title="\" />
5.在數據庫處理中,對象的基本操作增刪改查都是無可爭議的基礎:
+(void)addNewFamilyWithName:(NSString *)name address:(NSString *)address success:(void (^)())success failure:(void(^)(NSError *error))failure{
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = appDelegate.managedObjectContext;
NSManagedObject *family = [NSEntityDescription insertNewObjectForEntityForName:@"Family" inManagedObjectContext:context];
[family setValue:name forKey:@"name"];
[family setValue:address forKey:@"address"];
NSError *error = nil;
BOOL isSuccess = [context save:&error];
if (!isSuccess) {
if (failure) {
failure(error);
}
}else{
if (success) {
success();
}
}
}
+(void)deleteFamily:(Family *)family success:(void (^)())success failure:(void(^)(NSError *error))failure{
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = appDelegate.managedObjectContext;
[context deleteObject:family];
NSError *error = nil;
BOOL isSuccess = [context save:&error];
if (!isSuccess) {
if (failure) {
failure(error);
}
}else{
if (success) {
success();
}
}
}
+(NSArray *)fetchFamilyLists{
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = appDelegate.managedObjectContext;
// 初始化一個查詢請求
NSFetchRequest *request = [[NSFetchRequest alloc] init];
// 設置要查詢的實體
request.entity = [NSEntityDescription entityForName:@"Family" inManagedObjectContext:context];
// 設置排序(按照age降序)
// NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];
// request.sortDescriptors = [NSArray arrayWithObject:sort];
// 設置條件過濾(搜索name中包含字符串"M"的記錄,注意:設置條件過濾時,數據庫SQL語句中的%要用*來代替,所以%M%應該寫成*M*,更多過濾方法,可以看下一篇轉載文章)
// NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@", @"*M*"];
// request.predicate = predicate;
// 執行請求
NSError *error = nil;
NSArray *objs = [context executeFetchRequest:request error:&error];
if (error) {
[NSException raise:@"查詢錯誤" format:@"%@", [error localizedDescription]];
}
// 遍歷數據
for (NSManagedObject *obj in objs) {
NSLog(@"name=%@", [obj valueForKey:@"name"]);
}
return objs;
}