zoukankan      html  css  js  c++  java
  • 使用开源库MagicalRecord操作CoreData

     

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

  • 相关阅读:
    简单明了的带你理解springboot原理和三大核心注解
    Spring Boot(一):入门篇
    【Mysql优化】聚簇索引与非聚簇索引概念
    Mysql索引原理与优化
    Mysql全文索引的使用
    索引的优缺点,如何创建索引
    184 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 04 例:字符串与byte(即:字节)数组间的相互转换
    183 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 03 String常用方法(下)
    182 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 02 String常用方法(上)
    181 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 01 String常用方法简介
  • 原文地址:https://www.cnblogs.com/hw140430/p/4076260.html
Copyright © 2011-2022 走看看