zoukankan      html  css  js  c++  java
  • MagicalRecord使用教程【转载】

    原文地址:http://www.ithao123.cn/content-96403.html

    下面是在xcode5.1下ARC环境中的使用教程

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

    2. 在 .pch 文件中引入头文件 CoreData+MagicalRecord.h

    注:只能在.pch文件中引头文件,否则无法通过编译

    3. 创建 Model.xcdatamodeld 文件,并创建一个 Student 的 ENTITIES,最后创建出 Student 类

    4. 在 Appdelete.m 文件中写以下代码

    以下是增删改查的基本操作,但注意一点,在做任何的数据库操作之前,请先初始化以下,在Appdelete载入时初始化一次即可,否则找不到数据库而崩溃,你懂的.

        //设置数据库名字
        [MagicalRecord setupCoreDataStackWithStoreNamed:@"Model.sqlite"];

    增加

    增加一条记录
        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来通知存储成功,异步操作)

    以下为打印信息

    ----------------------------------------------------------------------------------------------------------------------------------------------------

    2014-03-13 11:17:43.616 StudyMagicalRecord[26416:60b] +[NSManagedObjectContext(MagicalRecord) MR_contextWithStoreCoordinator:](0x2f4498) -> Created Context UNNAMED
    2014-03-13 11:17:43.616 StudyMagicalRecord[26416:60b] +[NSManagedObjectContext(MagicalRecord) MR_setRootSavingContext:](0x2f4498) Set Root Saving Context: <NSManagedObjectContext: 0xe74d910>
    2014-03-13 11:17:43.617 StudyMagicalRecord[26416:60b] +[NSManagedObjectContext(MagicalRecord) MR_newMainQueueContext](0x2f4498) Created Main Queue Context: <NSManagedObjectContext: 0xe74e040>
    2014-03-13 11:17:43.617 StudyMagicalRecord[26416:60b] +[NSManagedObjectContext(MagicalRecord) MR_setDefaultContext:](0x2f4498) Set Default Context: <NSManagedObjectContext: 0xe74e040>
    2014-03-13 11:17:43.618 StudyMagicalRecord[26416:60b] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0xe74e040) → Saving <NSManagedObjectContext (0xe74e040): *** DEFAULT ***> on *** MAIN THREAD ***
    2014-03-13 11:17:43.618 StudyMagicalRecord[26416:60b] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0xe74e040) → Save Parents? 1
    2014-03-13 11:17:43.619 StudyMagicalRecord[26416:60b] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0xe74e040) → Save Synchronously? 0
    2014-03-13 11:17:43.619 StudyMagicalRecord[26416:60b] time
    2014-03-13 11:17:43.622 StudyMagicalRecord[26416:60b] -[NSManagedObjectContext(MagicalRecord) MR_contextWillSave:](0xe74e040) Context DEFAULT is about to save. Obtaining permanent IDs for new 1 inserted objects
    2014-03-13 11:17:43.623 StudyMagicalRecord[26416:60b] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0xe74d910) → Saving <NSManagedObjectContext (0xe74d910): *** BACKGROUND SAVING (ROOT) ***> on *** MAIN THREAD ***
    2014-03-13 11:17:43.624 StudyMagicalRecord[26416:60b] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0xe74d910) → Save Parents? 1
    2014-03-13 11:17:43.624 StudyMagicalRecord[26416:60b] -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0xe74d910) → Save Synchronously? 0
    2014-03-13 11:17:43.625 StudyMagicalRecord[26416:1303] -[NSManagedObjectContext(MagicalRecord) MR_contextWillSave:](0xe74d910) Context BACKGROUND SAVING (ROOT) is about to save. Obtaining permanent IDs for new 1 inserted objects
    2014-03-13 11:17:43.626 StudyMagicalRecord[26416:1303] __70-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:]_block_invoke25(0xe74d910) → Finished saving: <NSManagedObjectContext (0xe74d910): *** BACKGROUND SAVING (ROOT) ***> on *** BACKGROUND THREAD ***
    2014-03-13 11:17:43.627 StudyMagicalRecord[26416:60b] YES

    ----------------------------------------------------------------------------------------------------------------------------------------------------

    2.如何关闭 MagicalRecord 提供的打印信息?

    修改 MagicalRecord.h 23 行处的值,把 0 改为 1 即可.

  • 相关阅读:
    手写Promise(转)
    阻止element组件中的<el-input/>的粘贴功能(转)
    js 对象深拷贝函数
    20182301 2019-2020-1《程序设计与数据结构》课程总结
    20182301 2019-2020-1 《数据结构与面向对象程序设计》实验9报告
    团队博客第二周——DIG
    20182301 2019-2020-1 《数据结构与面向对象程序设计》第十周学习总结
    《团队作业第一周》团队作业——DIG
    20182301 2019-2020-1 《数据结构与面向对象程序设计》哈夫曼实验报告
    20182301 2019-2020-1 《数据结构与面向对象程序设计》第9周学习总结
  • 原文地址:https://www.cnblogs.com/g-ios/p/4806182.html
Copyright © 2011-2022 走看看