CoreData __ 基本原理

操作过程

  • Context想要获取值,先要告诉连接器,我要什么东西
  • 链接器再告诉store, 你给我什么东西, store去找
  • 找到之后返回给链接器,链接器再返回给Context               

CoreData和sqlite的区别

  • CoreData是一个框架;sqlite是苹果使用别人开发好的一个动态库,本质是关系型数据库.
  • CoreData是IOS平台下的一个数据持久化的方式;sqlite可以跨平台使用.

实现思路

  •   首先找到CoreData文件夹
  •   创建Person类,并且建立name属性

Command + N 创建

//代码实现

-------ViewController.h

#import "ViewController.h"
//coreData的框架
//导入框架的方式 : <框架名字/头文件名字>
#import <CoreData/CoreData.h>
#import "Person.h"
#import "AppDelegate.h"

@interface ViewController ()<UITableViewDelegate, UITableViewDataSource>

@property (nonatomic, strong) UITableView *tableView;
//临时数据库
@property (nonatomic, strong) NSManagedObjectContext *objectContext;
//数据源数组
@property (nonatomic, strong) NSMutableArray *dataArray;

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    self.dataArray = [NSMutableArray array];
    //获取到我们最开始使用的AppDelegate
    AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
    self.objectContext = app.managedObjectContext;

    //调用查询数据的方法
    [self searchAll];

    _tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:(UITableViewStylePlain)];
    [self.view addSubview:_tableView];
    _tableView.delegate = self;
    _tableView.dataSource = self;
    [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:(UIBarButtonSystemItemAdd) target:self action:@selector(barButtonItemClicked)];

}

- (void)barButtonItemClicked
{
    //NSEntityDescription : 实体描述类,通过类方法创建
    //第一个参数 : 表示这个实体描述类描述的是哪个实体 (表名)
    //第二个参数 : 表示的是在context里边创建一个描述,告诉context我要往里面插入一个object了
    NSEntityDescription *description = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.objectContext];
    //创建一个实体类
    //第一个参数 : 实体描述
    //第二个参数 : 在context里面放入这个类
    Person *person = [[Person alloc] initWithEntity:description insertIntoManagedObjectContext:self.objectContext];

    int number = arc4random() % 2000;
    person.name = [NSString stringWithFormat:@"%d号李四", number];

    [self insertObject:person];

}

//向coreData中插入一条数据
- (void)insertObject:(Person *)person
{

    NSError *error = nil;
    //把context保存到本地
    //这个方法执行之后, 本地数据才发生了改变
    [self.objectContext save:&error];

    if (error == nil) {
        [self.dataArray addObject:person];
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.dataArray.count - 1 inSection:0];
        [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationFade)];
    }
}

//搜索全部
- (void)searchAll
{
    //创建一个查询操作, 查询哪个表里面的内容
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];

    //接收查询数据
    NSError *error = nil;
    //让context去执行查询操作, 并且返回一个结果数组
    NSArray *array = [self.objectContext executeFetchRequest:request error:&error];

    //判断error是否为nul
    if (error == nil) {
        [self.dataArray setArray:array];

        [self.tableView reloadData];
    }else
    {
        NSLog(@"查询失败 ");
    }
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    //判断一下当前的编辑状态
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //获取到想要删除的那条数据
        Person *person = self.dataArray[indexPath.row];
        //在context中将这条数据删除
        [self.objectContext deleteObject:person];

        NSError *error = nil;

        [self.objectContext save:&error];

        if (error == nil) {
            //先删数据
            [self.dataArray removeObject:person];
            //然后更新UI
            [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationFade)];
        }
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //知道要改谁
    Person *person = self.dataArray[indexPath.row];

    int number = arc4random() % 2000;
    person.name = [NSString stringWithFormat:@"%d号张三", number];

    NSError *error = nil;

    [self.objectContext save:&error];

    if (error == nil) {
        [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationFade)];
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"forIndexPath:indexPath];
    Person *person = self.dataArray[indexPath.row];
    cell.textLabel.text = person.name;

    return cell;
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
时间: 2024-10-08 00:17:05

CoreData __ 基本原理的相关文章

修炼一名程序员的职业水准(林庆忠__署名原创)

http://blog.csdn.net/baselive/article/details/306412 摘: 作者:林庆忠,1990年毕业于昆明工学院计算机软件专业,后又于1999年毕业在南京大学 完成软件工程专业硕士的学习,现供职于CNPC旗下的一个行业软件研发中心,因为在网上看了许多有经验的各路软件开发人员写的好帖,一时手痒兴起,也凑一篇壮壮声势. 假设你是一名软件专业毕业的本科学子,如何在工作中修炼成为一名有较高职业水准的程序员呢,本文试图总结作者从事15年软件开发工作的感想,希望对有志

coredata 的基本使用(转载)

CoreData提供了一种简便的对象持久化管理方法,使你可以不用关心数据的存储,只需要关心对象的增加.删除.更改.读写. 基本概念托管对象(managed object)一个托管对象代表你想要保存到数据存储中的一个对象.这在概念上类似于SQL中的一条记录, 并且通常也包含一些域,这些域对应于你想要保存的对象的属性. 数据存储(data store)Core Data支持4中类型的数据存储:SQLiteStore, XMLStore, BinaryStore, InMemoryStore. 托管对

一、DNS解析的基本原理

1.基础知识 DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析).DNS协议运行在UDP协议之上,使用端口号53. 2.专业术语 FQDN : Full Qualified Domain Name  完全合格域名 例如:www.baidu.com   www.mirrors.163.com

android插件化-apkplug中OSGI服务基本原理-08

我们提供 apkplug 下OSGI使用demo 源码托管地址为 http://git.oschina.net/plug/OSGIService 一 OSGI与android Service 异同点 OSGI服务与android Service概念差不多也是Service ,Client 关系. android Service接口  --service.AIDL OSGI接口                --java interface 所以android 进程间通信Service只能传递序列

显示数据库中的存储过程__转

It's no easy trick to see stored procedures in a database programmatically with a scripting language like ASP. If you're using MS Access, you're out of luck. Access provides no way to see the actual meat of a stored procedure although you can get the

使用WIF实现单点登录Part II —— Windows Identity Foundation基本原理

在上一篇文章中,我们已经使用WIF构建了一个基于MVC4的简单的身份验证程序,在这篇文章里,我们将探讨一下到底什么是WIF,以及它的工作原理.然后在下一篇文章开始,我们将实际操作,实现单点登录功能. 身份标识的挑战 在上一篇文章也提及到了,大部分的开发人员并不是安全方面的专家,很多人对于身份验证,授权以及用户体验个性化等工作感觉非常的不爽.传统的计算机技术的课程里通常也不会教这些课题,因此这些东西经常在软件开发周期的后半部分才会凸显出来.当今,一个公司里有数十上百个Web应用程序和服务已不是什么

Android 5.0 怎样正确启用isLoggable(二)__原理分析

前置文章 <Android 5.0 怎样正确启用isLoggable(一)__使用具体解释> 概要 在上文<Android 5.0 怎样正确启用isLoggable(一)__使用具体解释>中分析了isLoggable的用法,本文主要分析isLoggable实现原理以及user版系统root后永久enable isLoggable的原理,并使用脚本自己主动设置isLoggable相关属性. 本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处

TCP和UDP基本原理

TCP和UDP基本原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 传输层的主要任务就是建立应用程序间的端到端连接,并且为数据传输提供可靠或不可靠的通信服务,TCP/IP协议族的传输层协议主要包括TCP和UDP ,TCP是面向连接的可靠的传输层协议,它支持在不可靠网络上实现面向连接的可靠的数据传输 ,UDP是无连接的传输协议,主要用于在相对可靠的网络上的数据传输,或用于对延迟较敏感的应用等. 1.传输层的作用 a>.提供面向连接或无连接的服务 b>.维护连接状态 c>

ZooKeeper基本原理

转自:http://www.cnblogs.com/edison2012/p/5654011.html ZooKeeper简介 ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. ZooKeeper设计目的 1.最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能. 2.可靠性:具有简单.健壮.良好的性能,如果消息m被到一台服务器接受,那么它将被所