CoreData / MagicalRecord
CoreData
之前在學習使用SQLite時, 需要編寫大量的sql語句,完成數據的增刪改查,但對于不熟悉sql語句的開發人員來說,難度較大,調試程序比較困難。由此出現CoreData框架,將sql的操作轉換成為對象的操作,無需編寫sql語句。并且對數據庫的操作也可以可視化。
?
1. CoreData 自iOS5出現的框架,提供了對象-關系映射(ORM)功能。通過此框架可將 對象 轉化成數據,存儲到SQLite 數據庫文件中,也能將SQLite數據庫中的數據轉化成對象。CoreData實際上是封裝了的SQLite操作的庫,封裝度高,無需開發人員接觸SQL語句。
?? 數據庫中的數據(表)與對象的關系,如下圖:
? ?
?? ? ? ?
?? 在CoreData中,需要被映射的對象被稱為實體(entity),即sqlite中的表;每個實體都有屬性,即sqlite中對應表的字段。
? ? > 使用CoreData?
?? ? ? — 先創建模型文件(相當于創建數據庫表結構),后綴名 xcdatamodeld
?? ? ? ? ? 兩種方式創建:
?? ? ? ? ? a. 可以在創建iOS 工程時,選擇 use Core Data, 工程中會自動生成模型文件
?? ? ? ? ? b. 創建工程后 New file ,選擇iOS ->Core Data -> Data Model
?? ? ? — 添加實體,(添加表)
?? ? ? ? ? Add Entity 注意:實體名字首字母大寫
?? ? ? — 給實體添加屬性 (在表中添加字段)
?? ? ? ? ? Attributes -> +? 注意:實體屬性名字首字母小寫
?? ? ? — 如何通過代碼訪問
?? ? ? ? ? 先了解CoreData 中的核心對象
?? ? ? ? ? 1.) Managed Object Model? 管理的對象模型
?? ? ? ? ? ? 描述應用程序的數據模型,這個模型包含實體(Entity),屬性(Property),讀取請求(Fetch Request)等。 對應代碼中的類:NSManagedObject ,類似于NSDictionary , 通過鍵-值存取實體屬性。
?? ? ? ? ? ? 2.)Managed Object Context 管理的對象上下文
?? ? ? ? ? ? 參與對數據對象進行各種操作的全過程,并監測數據對象的變化,以提供對 undo/redo 的支持及更新綁定到數據的 UI。
?? ? ? ? ? ? 3.)Persistent Store Coordinator 持久化存儲協調者
?? ? ? ? ? ? 相當于數據文件管理器,處理底層的對數據文件的讀取與寫入。一般我們無需與它打交道。
?? ? ? ? ? ? 4. )Managed Object 管理的對象
?? ? ? ? ? ? 數據對象,與 Managed Object Context 相關聯。
?? ? ? — 代碼訪問步驟:
?? ? ? ? ? 1. )初始化NSManagedObjectModel對象,加載模型文件,讀取app中的所有實體信息
?? ? ? ? ? ? 2. )初始化NSPersistentStoreCoordinator對象,添加持久化庫(這里采取SQLite數據庫)
?? ? ? ? ? ? 3. )初始化NSManagedObjectContext對象,拿到這個上下文對象操作實體,進行增刪改查(CRUD)操作
? ? ? ? ? ? ? 代碼如下:
? ? ? ? ? ? ? // 獲取應用程序資源束下的數據實體
? ? ? ? ? ? ? NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
? ? ? ? ? // 以獲取的實體初始化持久化存儲的協調者(中間橋梁)
? ? ? NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
? ? ? ? ? // 在指定目錄下創建持久化存儲,基于sqlite類型
? ? ? NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
? ? ? ? ? NSURL *url = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:@"my.db"]];
? ? ? ? ? NSError *err = nil;
? ? ? ? ? NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&err];
? ? // 若創建持久化存儲失敗,則拋出異常
? ? if (store == nil) {
? ? ? ? NSLog(@"error");
? ? ? ? [NSException raise:@"error" format:@"%@",[err localizedDescription]];
? ? }
? ? ? ? ? // 創建數據操作的上下文,并指定其持久化存儲的協調者
? ? ? ? ? context = [[NSManagedObjectContext alloc] init];
? ? ? ? ? context.persistentStoreCoordinator = psc; ? ? ??
?
?? ? ? — 將Core Data中的 實體 與 代碼中的 數據模型 對應
?? ? ? ? ? Core Data中的實體都是NSManagedObject類型的。
?? ? ? ? ? 創建繼承自NSManagedObject的子類
?? ? ? ? ? New file->iOS->Core Data-> NSManagedObject
?? ? ? ? ? 這樣在代碼中可通過 favorite.NewsId 來訪問實體屬性,而不是之前的 [nsManagedObject setValue: forKey:], [nsManagedObject valueForKey:];
?
?? ? ? -- 增,刪,改,查
? ? ? ? ? ? 增: // 先以數據實體為原型生成一個實體對象
?? ? ? ? ? ? ? ? ? Favorite *fr = [NSEntityDescription insertNewObjectForEntityForName:@"Favorite" inManagedObjectContext:context];
?? ? ? ? ? ? ? ? ? // 賦值操作
?? ? ? ? ? ? ? ? ? // 通過上下文保存此次增加
?? ? ? ? ? ? ? ? ? [context save:&err];
? ? ? ? ? ? 刪:// 先初始化抓取數據的請求,指定其抓取何種類型的實體對象
? ? ? ? ? ? ? ? ? [[NSFetchRequest alloc] initWithEntityName:@"Favorite"];
? ? ? ? ? ? ? ? ? // 指定其篩選數據的條件
? ? ? ? ? ? ? ? ? request.predicate = [NSPredicate predicateWithFormat:@"newsId = %@",@(objId)];
? ? ? ? ? ? ? ? ? // 執行抓取請求
? ? ? ? ? ? ? ? ? [context executeFetchRequest:request error:nil];
? ? ? ? ? ? ? ? ? // 刪除找到的數據
? ? ? ? ? ? ? ? ? [context deleteObject:obj];
?? ? ? ? ? ? ? ? ? // 務必通過上下文同步到數據存儲
?? ? ? ? ? ? ? ? ? [context save:&err];
?? ? ? ? ? ? 改: // 先初始化抓取數據的請求,指定其抓取何種類型的實體對象
? ? ? ? ? ? ? ? ? [[NSFetchRequest alloc] initWithEntityName:@"Favorite"];
? ? ? ? ? ? ? ? ? // 指定其篩選數據的條件
? ? ? ? ? ? ? ? ? request.predicate = [NSPredicate predicateWithFormat:@"newsId = %@",@(objId)];
? ? ? ? ? ? ? ? ? // 執行抓取請求
? ? ? ? ? ? ? ? ? [context executeFetchRequest:request error:nil];
? ? ? ? ? ? ? ? ? // 修改實體對象的值
? ? ? ? ? ? ? ? ? // 務必通過上下文同步到數據存儲
?? ? ? ? ? ? ? ? ? [context save:&err];
?? ? ? ? ? ?
?? ? ? ? ? ? ? 查: // 先初始化抓取數據的請求,指定其抓取何種類型的實體對象
? ? ? ? ? ? ? ? ? [[NSFetchRequest alloc] initWithEntityName:@"Favorite"];
? ? ? ? ? ? ? ? ? // 指定其篩選數據的條件
? ? ? ? ? ? ? ? ? request.predicate = [NSPredicate predicateWithFormat:@"newsId = %@",@(objId)];
? ? ? ? ? ? ? ? ? // 執行抓取請求
? ? ? ? ? ? ? ? ? [context executeFetchRequest:request error:nil];
?
?
MagicalRecord================================================
?
1. 官網:https://github.com/magicalpanda/MagicalRecord
?? MagicalRecord是對CoreData的深度封裝。使CoreData 代碼更簡潔,更簡單的獲取數據,并使用最優化的操作。
?? > 使用方法:
? ? ? — 將MagicalRecord 拖曳到工程目錄下,并添加CoreData框架。
? ? ? — 創建CoreData 數據模型DataModel,并創建實體Entity及屬性Attribute
? ? ? — 創建與數據模型中實體對應的類 ,繼承自NSManagedObject
? ? ? — 初始化CoreData堆棧 ,在AppDelegate 中
?? ? ? ? ? - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
? ? // Override point for customization after application launch.
? ? [MagicalRecord setupCoreDataStackWithStoreNamed:@"fav"];
? ? return YES;
}
?? ? ? — 數據增刪改查
?? ? ? ? ? 增:[Fav MR_createEntity];
?? ? ? ? ? ? ? // 對創建的新實體賦值
?? ? ? ? ? ? ? // 同步存儲到持久化庫中
?? ? ? ? ? ? ? [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
?
? ? ? ? ? 刪:[favmodel MR_deleteEntity];
?? ? ? ? ? ? ? // 同步存儲到持久化庫中
?? ? ? ? ? ? ? [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
?
? ? ? ? ? 改:// 先查詢出要修改的記錄? ?
?? ? ? ? ? ? ? ? [Fav MR_findFirstByAttribute:@"newsId" withValue:@(m.newsId.integerValue)];
?? ? ? ? ? ? ? // 更新查出的實體的值
?? ? ? ? ? ? ? // 同步存儲到持久化庫中
?? ? ? ? ? ? ? [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
?
? ? ? ? ? 查:[Fav MR_findAll];? // 查詢出所有記錄
?
轉載于:https://www.cnblogs.com/GJ-ios/p/5712992.html
總結
以上是生活随笔為你收集整理的CoreData / MagicalRecord的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式6---代理模式(Proxy P
- 下一篇: 在window 2008 server