日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CoreData / MagicalRecord

發布時間:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。