MagicalRecord

轉自  http://nuil.cn/topic/100402/%E4%BD%BF%E7%94%A8%E5%BC%80%E6%BA%90%E5%BA%93magicalrecord%E6%93%8D%E4%BD%9Ccoredatasql

 

使用開源庫MagicalRecord操做CoreData

1 year ago 0 數據庫

使用開源庫MagicalRecord操做CoreData

2014/11/5 14:21:26

1. 將 MagicalRecord 文件夾拖入到工程文件中,引入 CoreData.frame 框架框架

2. 在 .pch 文件中引入頭文件 CoreData+MagicalRecord.h異步

注:只能在.pch文件中引頭文件,不然沒法經過編譯函數

3. 建立 Model.xcdatamodeld 文件,並建立一個 Student 的 ENTITIES,最後建立出 Student 類性能

4. 在 Appdelete.m 文件中寫如下代碼ui

如下是增刪改查的基本操做,但注意一點,在作任何的數據庫操做以前,請先初始化如下,在Appdelete載入時初始化一次便可,不然找不到數據庫而崩潰,你懂的.spa

    //設置數據庫名字
    [MagicalRecord setupCoreDataStackWithStoreNamed:@"Model.sqlite"];線程

 

增長3d

增長一條記錄
    Student *person = [Student MR_createEntity];
    person.name = @"Y.X.";
    [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

注意:建立了對象後是須要執行存儲操做的

查詢

查詢全部的記錄

    NSArray *students = [Student MR_findAll];


根據某個屬性某個條件查詢

    NSArray *students = [Student MR_findByAttribute:@"name" withValue:@"Y.X."];

 

根據排序取得搜索結果

    NSArray *students = [Student MR_findAllSortedBy:@"name" ascending:YES];

 

查詢全部記錄

+ (NSArray *) MR_findAll;

根據上下文句柄查詢全部記錄
+ (NSArray *) MR_findAllInContext:(NSManagedObjectContext *)context;

根據某個屬性排序查詢全部記錄
+ (NSArray *) MR_findAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending;

根據某個屬性排序以及上下文操做句柄查詢全部記錄
+ (NSArray *) MR_findAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending inContext:(NSManagedObjectContext *)context;

根據某個屬性排序用謂詞來查詢記錄
+ (NSArray *) MR_findAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending withPredicate:(NSPredicate *)searchTerm;

根據某個屬性排序以及上下文操做句柄用謂詞來查詢記錄
+ (NSArray *) MR_findAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending withPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)context;

根據謂詞查詢
+ (NSArray *) MR_findAllWithPredicate:(NSPredicate *)searchTerm;

根據謂詞以及上下文操做句柄來查詢
+ (NSArray *) MR_findAllWithPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)context;

如下都是查詢一個對象時的操做,與上面重複,不一一贅述
+ (instancetype) MR_findFirst;
+ (instancetype) MR_findFirstInContext:(NSManagedObjectContext *)context;
+ (instancetype) MR_findFirstWithPredicate:(NSPredicate *)searchTerm;
+ (instancetype) MR_findFirstWithPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)context;
+ (instancetype) MR_findFirstWithPredicate:(NSPredicate *)searchterm sortedBy:(NSString *)property ascending:(BOOL)ascending;
+ (instancetype) MR_findFirstWithPredicate:(NSPredicate *)searchterm sortedBy:(NSString *)property ascending:(BOOL)ascending inContext:(NSManagedObjectContext *)context;
+ (instancetype) MR_findFirstWithPredicate:(NSPredicate *)searchTerm andRetrieveAttributes:(NSArray *)attributes;
+ (instancetype) MR_findFirstWithPredicate:(NSPredicate *)searchTerm andRetrieveAttributes:(NSArray *)attributes inContext:(NSManagedObjectContext *)context;
+ (instancetype) MR_findFirstWithPredicate:(NSPredicate *)searchTerm sortedBy:(NSString *)sortBy ascending:(BOOL)ascending andRetrieveAttributes:(id)attributes, ...;
+ (instancetype) MR_findFirstWithPredicate:(NSPredicate *)searchTerm sortedBy:(NSString *)sortBy ascending:(BOOL)ascending inContext:(NSManagedObjectContext *)context andRetrieveAttributes:(id)attributes, ...;
+ (instancetype) MR_findFirstByAttribute:(NSString *)attribute withValue:(id)searchValue;
+ (instancetype) MR_findFirstByAttribute:(NSString *)attribute withValue:(id)searchValue inContext:(NSManagedObjectContext *)context;
+ (instancetype) MR_findFirstOrderedByAttribute:(NSString *)attribute ascending:(BOOL)ascending;
+ (instancetype) MR_findFirstOrderedByAttribute:(NSString *)attribute ascending:(BOOL)ascending inContext:(NSManagedObjectContext *)context;

修改

    NSArray *students = [Student MR_findByAttribute:@"name" withValue:@"Y.X."];
    for (Student *tmp in students) {
        tmp.name = @"Jane";
    }
    [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

注意:既然要修改首先得須要找到記錄,根據條件匹配找到記錄,而後修改,而後保存

 

刪除

    NSArray *students = [Student MR_findByAttribute:@"name" withValue:@"Frank"];
    for (Student *tmp in students) {
        [tmp MR_deleteEntity];
    }
    [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]; 

注意:既然要刪除首先得須要找到記錄,根據條件匹配找到記錄,而後刪除,而後保存

 

心得體會

若是項目中對於操做數據庫沒有性能要求請使用 CoreData 相關的開源庫吧.

CoreData 操做較爲複雜, MagicalRecord 有着不少的特性,好比能夠根據設置在主線程或者子線程中進行操做,方便快捷,能入榜最佳10大開源庫自有其獨到的地方,會使用 MagicalRecord 須要具有必定的 CoreData 相關知識,本人也只是現學現用,但深知其能夠爲開發帶來的好處,使用數據庫的朋友有着以下的一些選擇.

1. SQLite3                 C函數形式(本人以前作過幹嵌入式開發,即便是這樣也不推薦使用面向過程毫無對象概念的SQLite3,有更好的方式爲何不用呢?)

2. FMDB                    對SQLite3的封裝,有着對象的概念,熟悉SQ語句的朋友可使用,但尚未作到對象與記錄實時對應

3. CoreData              他作到了對象與記錄實時對應關係,使用其自身的搜索體系(不用SQ語言),但其基本的操做以及配置讓人望而卻步

4. MagicalRecord      對 CoreData 官方的用法進行了人性化的封裝,用過 CoreData 基本操做再使用 MagicalRecord 會深有體會

5. ObjectiveRecord   也是對 CoreData 的人性化封裝,使用更加傻瓜,但傻瓜的代價就是犧牲了一些更強大的功能,在Github上搜索關鍵字便可

 

附錄:

1.默認的就是在後臺存儲的,不會阻塞主線程

我在 CoreData+MagicalRecord.h 文件中定義了宏 MR_SHORTHAND ,因此在方法中不須要 MR_ 前綴了

如下爲代碼(提供block來通知存儲成功,異步操做)

 

2.如何關閉 MagicalRecord 提供的打印信息?

如下爲打印信息:
2014-11-05 13:50:09.558 IM[2440:60b] +[NSManagedObjectContext(MagicalRecord) MR_contextWithStoreCoordinator:](0x3b50f3f8) -> Created Context UNNAMED
2014-11-05 13:50:09.566 IM[2440:60b] +[NSManagedObjectContext(MagicalRecord) MR_setRootSavingContext:](0x3b50f3f8) Set Root Saving Context: <NSManagedObjectContext: 0x1550b4b0>
2014-11-05 13:50:09.569 IM[2440:60b] +[NSManagedObjectContext(MagicalRecord) MR_newMainQueueContext](0x3b50f3f8) Created Main Queue Context: <NSManagedObjectContext: 0x1550e2e0>
2014-11-05 13:50:09.576 IM[2440:60b] +[NSManagedObjectContext(MagicalRecord) MR_setDefaultContext:](0x3b50f3f8) Set Default Context: <NSManagedObjectContext: 0x1550e2e0>

修改 MagicalRecord.h 23 行處的值,把 0 改成 1 便可.

相關文章
相關標籤/搜索