iOS_SN_CoreDate(一)封装使用

看过一篇封装CoreData的文章挺不错,有基本使用封装,但是没有写怎么与tableView结合使用,我自己用的过程有些小波折,自己做了一个demo,大家可以看源码一些基本使用应该不难了,

原文:http://blog.csdn.net/pengyuan_d/article/details/40657225?utm_source=tuicool&utm_medium=referral

(1)创建一个Data Model文件,命名为MyModel.xcdatamodeld

(2)创建Users表,添加如图的字段

(3)创建NSManagedObject subclass表实体文件

(4)在Users.m文件中,覆写description方法

CoreDataDBHelper.h

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>  

// 本地文件存储的路径
#define PATH [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/sqlite.db"]  

#define MODEL_NAME @"MyModel"  

@interface CoreDataDBHelper : NSObject
{
    // 1.数据模型对象
    NSManagedObjectModel *_managedObjectModel;  

    // 2.创建本地持久文件对象
    NSPersistentStoreCoordinator *_persistentStoreCoordinator;  

    // 3.管理数据对象
    NSManagedObjectContext *_managedObjectContext;
}  

// 设计成单例模式
+ (CoreDataDBHelper *)shareCoreDataDBHelper;  

// 添加数据的方法
- (BOOL)insertDataWithModelName:(NSString *)modelName
          setAttributWithDic:(NSDictionary *)params;  

// 查看
/*
    modelName           :实体对象类的名字
    predicateString     :谓词条件
    identifers          :排序字段集合
    ascending           :是否升序
 */
- (NSArray *)selectDataWithModelName:(NSString *)modelName
                     predicateString:(NSString *)predicateString
                                sort:(NSArray *)identifers
                           ascending:(BOOL)ascending;  

// 修改
- (BOOL)updateDataWithModelName:(NSString *)modelName
                predicateString:(NSString *)predicateString
             setAttributWithDic:(NSDictionary *)params;  

// 删除
- (BOOL)deleteDataWithModelName:(NSString *)modelName
                predicateString:(NSString *)predicateString;  

@end  

CoreDataDBHelper.m


#import "CoreDataDBHelper.h"  

@implementation CoreDataDBHelper  

- (instancetype)init
{
    self = [super init];
    if (self)
    {
        // 1.数据模型对象
        NSURL *modelUrl = [[NSBundle mainBundle] URLForResource:MODEL_NAME withExtension:@"momd"];
        _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl];  

        // 2.创建本地持久文件对象
        _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:_managedObjectModel];
        // 设置本地数据的保存位置
        NSURL *fileUrl = [NSURL fileURLWithPath:PATH];  

        [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:fileUrl options:nil error:nil];  

        // 3.管理数据对象
        _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator:_persistentStoreCoordinator];
    }
    return self;
}  

// 设计成单例模式
+ (CoreDataDBHelper *)shareCoreDataDBHelper
{
    static CoreDataDBHelper *coreDataDBHelper = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        coreDataDBHelper = [[CoreDataDBHelper alloc] init];
    });  

    return coreDataDBHelper;
}  

// 添加数据的方法
/*
    params : @{
                  @"name":@"张三",
                  @"age":@20
             }
 */
- (BOOL)insertDataWithModelName:(NSString *)modelName
             setAttributWithDic:(NSDictionary *)params
{
    NSEntityDescription *entity = [NSEntityDescription insertNewObjectForEntityForName:modelName inManagedObjectContext:_managedObjectContext];  

    // 遍历参数字典
    for (NSString *key in params)
    {
        SEL selector = [self selWithKeyName:key];
        if ([entity respondsToSelector:selector])
        {
            [entity performSelector:selector withObject:params[key]];
        }
    }
    [_managedObjectContext insertObject:entity];  

    // 保存到本地
    return [_managedObjectContext save:nil];
}  

// 查看
/*
 modelName           :实体对象类的名字
 predicateString     :谓词条件
 identifers          :排序字段集合
 ascending           :是否升序
 */
- (NSArray *)selectDataWithModelName:(NSString *)modelName
                     predicateString:(NSString *)predicateString
                                sort:(NSArray *)identifers
                           ascending:(BOOL)ascending
{
    // 1.创建实体对象
    NSEntityDescription *entity = [NSEntityDescription entityForName:modelName inManagedObjectContext:_managedObjectContext];  

    // 2.创建一个查询对象
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    // 告诉查询对象你要查询的数据类型
    [request setEntity:entity];  

    // 添加查询条件
    if (predicateString != nil || [predicateString isEqualToString:@""])
    {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
        [request setPredicate:predicate];
    }  

    // 3.设置排序
    NSMutableArray *sortDescriptors = [NSMutableArray array];
    for (NSString *identifer in identifers)
    {
        // 创建排序对象
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:identifer ascending:ascending];
        // 把排序对象添加到数组中
        [sortDescriptors addObject:sortDescriptor];
    }
    // 把排序对象设置到查询对象里面
    [request setSortDescriptors:sortDescriptors];  

    // 3.开始查询
    return [_managedObjectContext executeFetchRequest:request error:nil];
}  

// 修改
- (BOOL)updateDataWithModelName:(NSString *)modelName
                predicateString:(NSString *)predicateString
             setAttributWithDic:(NSDictionary *)params
{
    // 获取所有需要修改实体对象
    NSArray *entitys = [self selectDataWithModelName:modelName predicateString:predicateString sort:nil ascending:NO];  

    // 遍历所有的实体对象
    for (NSEntityDescription *entity in entitys)
    {
        // 修改对象的属性
        for (NSString *key in params)
        {
            SEL selector = [self selWithKeyName:key];
            if ([entity respondsToSelector:selector])
            {
                [entity performSelector:selector withObject:params[key]];
            }
        }
    }  

    return [_managedObjectContext save:nil];  

}  

// 删除
- (BOOL)deleteDataWithModelName:(NSString *)modelName
                predicateString:(NSString *)predicateString
{
    // 获取所有需要修改实体对象
    NSArray *entitys = [self selectDataWithModelName:modelName predicateString:predicateString sort:nil ascending:NO];  

    // 遍历所有的实体对象
    for (NSEntityDescription *entity in entitys)
    {
        // 删除对象
        [_managedObjectContext deleteObject:entity];  

    }  

    return [_managedObjectContext save:nil];
}  

// 通过一个字符串反回一个set方法
- (SEL)selWithKeyName:(NSString *)keyName
{
    NSString *first = [[keyName substringToIndex:1] uppercaseString];
    NSString *end = [keyName substringFromIndex:1];
    NSString *selString = [NSString stringWithFormat:@"set%@%@:",first,end];
    return NSSelectorFromString(selString);
}  

@end

iOS_SN_CoreData Demo 

时间: 2024-08-05 03:24:32

iOS_SN_CoreDate(一)封装使用的相关文章

python学习 面向对象封装

from collectoins import namedtuplePoint=namedtuple('point',['x','y'])t1=Point(1,2)print(t1.x)print(t1.y)没有方法的类属性不会发生变化    定义简单 不能改变面向对象封装私有属性!!!私有方法!!!用装饰器描述的几个方法@property !!!@classmethod!!@staticmethod! 封装:class Teacher:     def __init__(self,name,p

python—面向对象的封装

封装 私有属性 class Teacher: __identifier = 'Teacher' #私有静态属性 def __init__(self,name,pwd) self.name = name self.__pwd = pwd #私有属性 内部使用,外部不能使用 def pwd(self): print(self.__pwd) alex = Teacher('alex','3714') alex.pwd() class Teacher: __identifier = 'Teacher'

dbutils封装对象,单列,一行一列(用)

基本用法:查找并封装对象与对象集合 public User findUserByNamePassword(String name,String password){ QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource()); String sql = "select * from user where name='"+name+"' and password = '"+password

python基础--接口与归一化设计、封装、异常、网络编程

1 接口与归一化设计 1.1 归一化概念: 归一化的好处: 1.归一化让使用者无需关心对象的类是什么,只需要知道这些对象都具备某些功能就可以了,这极大降低了使用者的使用难度. 2.归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合 继承的两种用途 一:继承基类的方法,并且做出自己改变或者扩展(代码重用):实践中,继承的这种用途意义并不很大,甚至常常是有害的.因为它使得子类与基类出现强耦合. 二:声明某个子类兼容于某基类,定义一个接口类(模仿java的Interface),接口类中

自动化测试框架 selenium api的封装

接上一篇 http://tianxietaotao.blog.51cto.com/12002420/1951701 这篇我大概介绍下我这个工具的简单介绍 先上图: 制作背景: Web自动化测试在现在测试领域已经越来越普遍,但是写代码对于好多测试猿代码基础较弱,搭建系统也比较麻烦.所以我抽闲暇时间做了这个简单的工具:下面简单介绍下功能 工具简单介绍: 1.工具栏:Resume:调试阶段执行到下一个断点 next:单步执行 debug/run 模式切换 执行.停止 2.用例树:用例采用execl或者

lambda表达式封装对数据库的查询

前言: 1.为什么要封装lambda表达式数据库查询,原因有一下几点: 1.1.在以往的开发中进行数据库表查询时,其实所需要的字段就是其中几个,但是在开发中,开发者往往习惯select * 进行查询,当数据多和用户量多时,查询的效率会降低. 1.2.在写查询where条件的时候,总是用string.format去拼接字符串,开发效率低. 1.3.代码不够优雅,代码中嵌套和多sql语句,如果是表字段发生改变时编译器检查不出来,代码出错的概率大. 1.4.本着 write less  do more

Android封装TitleBar基本适用所有常规开发

Android封装TitleBar基本适用所有常规开发 github地址:https://github.com/SiberiaDante/SiberiaDanteLib/blob/master/sample/src/main/notes/TitleBar.md 主要实现:(后续会继续完善,喜欢的给个star,感谢支持) 使用方法 allprojects { repositories { ... aven { url 'https://jitpack.io' } } } dependencies

将数据库从服务器移到浏览器--indexedDB基本操作封装

数据库是属于服务器的,这是天经地义的事,但是有时候数据也许并非需要存储在服务器,但是这些数据也是一条一条的记录,怎么办?今天来带领你领略一下H5的一个新特性--indexedDB的风骚.你会情不自禁的发出感叹--不可思议! 一.链接数据库 indexedDB没有创建数据库的概念,你可以直接链接数据库,如果你链接的数据库并不存在,那么会自动的创建一个数据库.看下面的这个例子. <!DOCTYPE html> <html lang="en"> <head>

Java基础——封装

最近学习Java面向对象方面的知识点,一直没时间更新博客,因为这块的知识点真的蛮绕的.一个知识点一个知识点的往外冒,而且对于我这个初学者来说区分构造器和方法就花费了一整天的时间.现在准备再重新过一遍知识点. 先背下来一个理念: 面向对象程序设计是将数据放在第一位的,然后再考虑操作数据的方法. 之前,再学习Java的优越性的时候,我们知道了Java是一种面向对象设计的程序设计语言.那到底什么是面向对象程序设计呢?要弄懂它,首先我们简单了解一下另一种程序设计. 一.面向过程程序设计: 面向过程程序设