zoukankan      html  css  js  c++  java
  • 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%9Ccoredata

    使用开源库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 文件中写以下代码

    以下是增删改查的基本操作,但注意一点,在做任何的数据库操作之前,请先初始化以下,在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来通知存储成功,异步操作)

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

  • 相关阅读:
    理解Restful 架构
    CLR 异步函数
    CLR 线程池
    CLR 线程基础
    CLR 序列化
    CLR 垃圾回收和应用程序集
    CLR的垃圾回收机制
    定制特性
    枚举和迭代器
    接口
  • 原文地址:https://www.cnblogs.com/feng-a/p/4218765.html
Copyright © 2011-2022 走看看