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 便可.

相关文章
相关标签/搜索