iOS数据存储之CoreData

iOS中大量数据的储存一个是SqLite,另一个就是CoreData,CoreData允许程序员以面向对象的思维方式的方法去操作面向表的数据库

做过Java开发的对这个应该很熟悉,Java中的Hibernate跟CoreData就很相似

CoreData应该怎样使用呢?

第一步,新建工程后导入CoreData框架

第二部,创建CoreData的数据模型创建步骤如下

然后给你的model起个名字,创建完成后你会看到一个这个文件(相当于数据库文件)

点击这个文件,然后看下图

点击图中1,新建实体(类似于数据局库中的表),,,然后再图中2位置给你的实体命名,,然后再图中三位置,给你的实体添加字段(类似于数据库中的列名)

前面只是建立了数据库里面的表,要通过类对象操作表,还需要有与之对应的对象

接下来就创建与之对应的对象,创建CoreData对象跟平常我们自己创建NSObject对象不同,CoreData对象是由工具创建的;见下图

按照图中的方式,一路next,之后你会发现,你的目录树中对了两个文件,名字与你的实体名相同

至此就完成了使用CoreData的基本工具上的工作,下面我们就开始写代码了

要在代码里跟操作CoreData文件,需要一个上下文对象(类似于sql中的句柄)

NSManagedObjectContext *sharedContext;

我们刚才创建哪些CoreData用的文件时,程序运行,APP会在MainBundle里创建一些文件,而这些文件就对应着创建的模型

,要操作一个或多个模型,需要用代码把这些文件合并起来,下面是合并的代码

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

然后数据文件表和对象建立关系需要一个中心调度者,

中心调度这可以建立起数据库和对象以及模型文件之间的对应关系

对应代码如下

 NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:path] options:nil error:nil];

    _sharedContext = [[NSManagedObjectContext alloc] init];
    _sharedContext.persistentStoreCoordinator = coordinator;

到此为止我们就可以很HAPPy的使用上下文操作对象和数据库之间的关系了

首先来看怎么向数据库中插入一个对象数据

因为要使对象跟数据库建立存储关系,所以创建对象时不要用以前的alloc 和init来创建了

要使用工具提供的方法,这样系统才知道对象和数据库的联系

Person *per = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:[DataManager sharedDataManager].sharedContext];
    per.name = @"jing";
    per.phoneNo = @"123123123";

    if([_sharedContext save:nil]){
        NSLog(@"yes");
    }else{
        NSLog(@"no");
    }

这样就可以将per对象存入到数据库中

下面就看看怎么去取数据

CoreData里取数据是就是去数据库里面查询数据,然后将数据返回来,因此我们需要一个查询结果控制器(非视图控制器)

NSFetchedResultsController *_fetchedResultsController;

执行查询的代码如下

// 查询请求
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];

    // 按照用户姓名升序排序
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];

    request.sortDescriptors = @[sort];

    /**
     参数:
     1> 查询请求
     2> 数据库上下文
     3> 表格中用于分组的字段名
     4> 缓存名称
     */
    _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];

    // 设置代理
    _fetchedResultsController.delegate = self;

    // 执行请求,抓取数据
    NSError *error = nil;

    if ([_fetchedResultsController performFetch:&error]) {
        NSLog(@"查询成功");

        NSLog(@"%@", _fetchedResultsController.sections);

    } else {
        NSLog(@"查询失败 %@", error.localizedDescription);
    }

创建查询结果控制器需要一个查询请求(类似于web请求中的URLrequest)和要查询的上下文

查询请求中需要写上查询model的名字,并且还需要给其设置一个排序的规则NSSortDescriptor对象(可以设置多个字段排序)

创建查询结果控制器的时候sectionNameKeyPath,有兴趣的可以研究一下,这个可以用来将查询后的数据分组(传入nil意味着所有的数据都在一组里)

上面的代码只是让查询结果控制器去数据库里面查找,如何将数据从结果控制器里面取出来呢?

Person *person = [_fetchedResultsController objectAtIndexPath:indexPath];

上面的代码可以将查询结果取出来,看着是不是很眼熟,跟TableView的一些方法是不是很像~,你在看看下面的代码

int total =  [_fetchedResultsController.sections[0] numberOfObjects];

上面的代码可以返回第0组数据中所含有的数据总数,是不是觉得跟tableview更像了

查询到这就完了,下面在看看如何删除一个对象

// 让上下文删除
        [context deleteObject:person];

        // 上下文保存
        if ([context save:nil]) {
            NSLog(@"删除成功!");
        } else {
            NSLog(@"删除失败!");
        }

上面一句话就搞定~怎么修改对象呢?

per.name = @"wokao";
  if ([context save:nil]) {
        NSLog(@"保存成功");

        // 返回上级视图控制器
        [self.navigationController popViewControllerAnimated:YES];
    } else {
        NSLog(@"保存失败!");
    }

直接在对象上修改你要修改的,然后save就行了,~╮(╯▽╰)╭是不是木有压力呢?

还有一个问题就是查询到了很多结果,怎么才能筛选一下呢>?你查到了100个结果,但是只有10个是你像看到的,怎么办呢?

表着急~有办法~

 // 1. 获取到查询结果控制器中的查询请求
    NSFetchRequest *reqest = _fetchedResultsController.fetchRequest;

    if (searchText.length > 0) {
        // 设置请求的过滤谓词
        reqest.predicate = [NSPredicate predicateWithFormat:@"name CONTAINS %@", searchText];
    } else {
        reqest.predicate = nil;
    }

    // 执行查询
    if ([_fetchedResultsController performFetch:nil]) {
        NSLog(@"刷新成功");
        [self.tableView reloadData];
    }

其实筛选就是把当时给查询结果控制器的请求在拿出来,加点谓词进去~然后重新执行查询就行了~

如果想恢复到原来的查询结果,request.predicate = nil;然后再重新查询就行了~

jiandannnnnnnn   ba

另外CoreData可以很轻松的存储二进制数据,如果你想用sql存储二进制数据啥的估计要费点劲了,而写很有可能或拖累你的查询性能

下面一行代码可以将UIImage对象转换为NSData对象

UIImagePNGRepresentation(_iconButton.imageView.image);

以后你会用的找的~~~~~~

还有一个照片选择控制器

UIImagePickerController

至于怎么用,自己去查资料~

iOS数据存储之CoreData,布布扣,bubuko.com

时间: 2024-08-26 12:30:41

iOS数据存储之CoreData的相关文章

IOS数据存储之CoreData使用

前言: 学习了Sqlite数据之后认真思考了一下,对于已经习惯使用orm数据的开发者或者对sql语句小白的开发者来说该如何做好数据库开发呢?这个上网搜了一下?看来总李多虑了!apple 提供了一种数据方式,它就是今天的主角:CoreData CoreData介绍: Core Date是ios3.0后引入的数据持久化解决方案,它是是苹果官方推荐使用的,不需要借助第三方框架.Core Date实际上是对SQLite的封装,提供了更高级的持久化方式.在对数据库操作时,不需要使用sql语句,也就意味着即

iOS数据存储的几种方式

iOS的数据存储是iOS应用开发的重要知识点: 关于这方面知识,网上有很多介绍,但对于代码层次的使用方式并未有系统全面介绍.此文章针对iOS稍熟悉的童鞋,需要对CoreData的原理有一定的了解.目前存储方式大概有以下几种: NSKeyedArchiver  适用简单数据加密 NSUserDefaults  适用配置参数 Write  文件操作,同NSKeyedArchiver SQLite3  操作较复杂,不建议使用. CoreData  取代SQLite3,但要遵循NSManagedObje

iOS数据存储之SqLite3

iOS中数据存储的方式有很多中,当数据量较大的时候偏好设置,归档和plist就无法满足需求了 这时候就需要用SqLite或者CoreData来存储数据 下面就来介绍一下如何使用SqLite存储数据 要使用Sqlite必须引入libSqlite3.dylib库 要使用首先要有一个handle句柄(handle句柄,在C语言中,通常把用于控制某类东西的叫做句柄,实际上是一个指针.) // 数据库句柄 sqlite3 *_db; SqLite存储数据时也是存在一个文件中的,只不过这个文件格式是定制的,

IOS数据存储 —— 2 存储方式

IOS数据存储方式 iOS开发常用数据存储方式有:plist.偏好设置 NSUserDefaults.对象归档 NSKeyedArchiver.SQLite3和Core Data 1. plist文件 存储 plist文件通常用于储存用户设置,利用xml属性列表归档NSDictionary.NSArray.NSNumber等类型数据 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用 注意:plist不能存储自定义对象 2. 偏好设置 NSUserDefaults 偏好设置

iOS数据存储类型 及 堆(heap)和栈(stack)

iOS数据存储类型 及 堆(heap)和栈(stack) 一般认为在c中分为这几个存储区: 1栈 --  由编译器自动分配释放. 2堆 --  一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收. 3全局区(静态存储区)-- 全局变量和静态变量的存储是放在一块区域 ,程序退出后自动释放 .全局区又分为全局初始化区和全局未初始化区.初始化的全局变量和静态变量存放在全局初始化区,未初始化的全局变量和未初始化的静态变量存放在相邻的另一块区域. 4常量区-- 专门放数字/字符常量的地方, 程

iOS数据存储之属性列表理解

iOS数据存储之属性列表理解 数据存储简介 数据存储,即数据持久化,是指以何种方式保存应用程序的数据. 我的理解是,开发了一款应用之后,应用在内存中运行时会产生很多数据,这些数据在程序运行时和程序一起驻留在内存中,一旦程序运行结束从内存中退出后,这些数据也就相应消失了.等到再次运行程序的时候,之前的那些数据又要重新计算.但是对于一些应用,我们需要将程序产生的数据持久的保存起来,使得应用重启之后这些数据不会丢失,这时候就需要用到数据的持久化技术. 在iOS设备上实现数据持久化存储的方式有很多中机制

iOS 数据存储 - 01基本介绍

1.应用沙盒 sandbox 1. 什么是沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是应用的文件夹),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒. 2.应用沙盒结构 应用程序包: 包含了所有的 资源文件和 可执行文件 Documents: 保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录.例如,游戏应用可将游戏存档保存在该目录.保存相对重要的数据 tmp: 保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除.应用没有运行时

iOS - 数据存储方式(本地化)

iOS中数据存储方式 一般使用以下4种: 1.NSKeyedAchiever//序列化 存放对象 2.NSUserDefaults//本质是plist存储 NSData.NSString.NSNumber.NSDate.NSArray.NSDictionary //存储到沙盒下的Library/Preferences/ 3.writeToFile:atomically://直接写文件方式:NSString.NSArray.NSDictionary.NSData.NSNumber,存放在一个属性列

iOS 持久化存储之CoreData VS 直接SQlite

原创Blog,转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS SDK详解专栏 http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html 前言: CoreData不是DB,也不是DBMS,它是一个对象图管理工具,它的底层存储使用SQLite,XML或者其它.通常使用CoreData的时候,也会用到第三方库,比如MagicalRecord. SQLite则是一个DB,有自己的DB Engine,开发