[iOS]30分钟入门OC-CoreData框架

一:什么是CoreData?

CoreData是苹果公司封装的进行数据持久化的框架,首次在IOS3.0版本的系统中出现,它允许按照实体--属性--值的模型组织数据,并以XML,二进制文件或者SQLite数据文件的格式持久化数据
(1)CoreData不是数据库,它只是操作数据库的框架
(2)CoreData不仅仅可以对数据库进行操作,而且还可以对xml和二进制文件进行操作
(3)可以节省代码量,一般要节省30%到70%的代码量

二:效果展示

三:基本配置

(1)勾选"Use Core Data"

四:布局配置

(1)去掉"Use Auto Layout"和"Use Size Classes"

(2)可视化添加顶部导航栏

在"Editor"-->"Embed In"-->选择"Navigation Controller"即可在模型上直接添加

(3)在组件中搜索"bar"找到item,拖拽到Navigation上面,并且可以对其进行自定义.


样式,样色,位置全部都可以进行自定义


(4)添加TableView,找到灰色的"TableView",将其拖拽到ViewController的正中间的位置,其大小可以进行拖拽来进行控制

(5)选择"Table View",点击最右键,将"dataSource"和"delegate"对"View Controller"进行关联

(6)点击"Table View"中的"Prototype Cells"属性,其表示的其实是显示的列数


表现为展示的一列


五:数据库操作

(1)数据库添加实体对象:点击"SQLiteTest.xcdatamodeld"

(2)添加实体对象"Clothes",其实这个实体对象相当于数据库中的表



在该对象(表)中,添加属性

点击"Editor"-->"Create NSManagedObject Subclass"-->将会生成关于"Clohes"的实现

-->

这个地方需要注意,如果在原来的Entity进行重命名,生成的数据库表名仍然为原来的值,唯一的办法是删掉重新写
此外,在"AppDelegate.h"中还会自动生成三个对象和两个方法

//
//  AppDelegate.h
//  SQLiteTest
//
//  Created by AqiuBeats on 16/10/10.
//  Copyright © 2016年 AqiuBeats. All rights reserved.
//

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

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
/**
 *  被管理对象上下文(数据管理器),相当于一个临时数据库(可视化建模的文件)
 */
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
/**
 *  被管理对象模型(数据模型器)
 */
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
/**
 *  持久化储存助理(数据链接器),整个CoreData框架的核心
 */
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
/**
 *  把我们临时数据库中进行的改变进行永久保存
 */
- (void)saveContext;
/**
 *  获取真实文件的储存路径
 */
- (NSURL *)applicationDocumentsDirectory;


@end

(3)对TableView中的"Cell"进行设置

在对行数设置为1之后



将该cell的样式设置为basic

(4)主体代码

//
//  ViewController.m
//  SQLiteTest
//
//  Created by AqiuBeats on 16/10/10.
//  Copyright © 2016年 AqiuBeats. All rights reserved.
//

#import "ViewController.h"
#import "AppDelegate.h"
#import "Clothes+CoreDataProperties.h"
#import "Clothes.h"

/**
 *  设置"UITableViewDelegate"和"UITableViewDataSource"可以获取TableView的使用方法
 */
@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>
- (IBAction)addModel:(id)sender;
@property (weak, nonatomic) IBOutlet UITableView *tableview;

@property(nonatomic,strong)NSMutableArray* dataSource;

//声明一个AppDelegate对象属性,来调用类中属性,比如被管理对象个上下文
@property(nonatomic,strong)AppDelegate* myAppDelegate;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //初始化数组
    self.dataSource=[NSMutableArray array];
    //初始化AppDelegate
    self.myAppDelegate=[UIApplication sharedApplication].delegate;
    //对TableView加上注册方法,"cell"表示的是自定义的方法
    [self.tableview registerClass :[UITableViewCell class] forCellReuseIdentifier:@"cell"];
    
#warning 查--查询数据
    //1.NSFetchRequest对象
    NSFetchRequest* request=[[NSFetchRequest alloc]initWithEntityName:@"Clothes"];
    //2.设置排序
//    //2.1创建排序描述对象(以int类型的价格为例,进行升序排列)
//    NSSortDescriptor *sortFunc=[[NSSortDescriptor alloc]initWithKey:@"price" ascending:YES];
//    request.sortDescriptors=@[sortFunc];
    //3.执行这个查询请求
    NSError* error=nil;
    NSArray *arr=[self.myAppDelegate.managedObjectContext executeFetchRequest:request error:&error];
    //给数据源数组中添加数据
    [self.dataSource addObjectsFromArray:arr];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
//tableView的delegate和dataSource的方法
/**
 *  返回分区中的行数,相当于listview的item数目
 */
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return self.dataSource.count;
}
/**
 *  返回分区的个数
 */
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}
/**
 *  对每个cell进行构造,相当于listview的item
 */
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell* cell=[tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    Clothes* cloth=self.dataSource[indexPath.row];
    cell.textLabel.text=[NSString stringWithFormat:@"品牌:%@--价格:%@",cloth.brand,cloth.price];
    return cell;
}
//允许tableView可编辑,这样就可以手动进行编辑了
-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
    return YES;
}
//对tableview的item可以进行各种手势操作
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    //滑动删除样式
    if (editingStyle==UITableViewCellEditingStyleDelete) {
#warning 删--删除数据,并对视图进行实时更新
        //删除数据源
        Clothes *cloth=self.dataSource[indexPath.row];
        [self.dataSource removeObject:cloth];
        //删除数据管理中的数据
        [self.myAppDelegate.managedObjectContext deleteObject:cloth];
        //将删除的更改进行永久保存
        [self.myAppDelegate saveContext];
        //删除单元格
        [self.tableview deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
        
    }
}
#warning 改--更改数据的属性值,并对视图进行实时更新
//点击cell来修改数据
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"当前位置%ld",(long)indexPath.row);
    //1.先找到模型对象
    Clothes* cloth=self.dataSource[indexPath.row];
    //2.将该熟悉值更改
    cloth.brand=@"Adidas";
    //3.刷新视图
    [self.tableview reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    //4.对数据的更改进行永久的保存
    [self.myAppDelegate saveContext];
}

/**
 *  插入数据
 */
- (IBAction)addModel:(id)sender {
#warning 增--插入数据
    //创建实体描述
    NSEntityDescription* description=[NSEntityDescription entityForName:@"Clothes" inManagedObjectContext:self.myAppDelegate.managedObjectContext];
    //1.先创建一个模型对象
    Clothes* cloth=[[Clothes alloc]initWithEntity:description insertIntoManagedObjectContext:self.myAppDelegate.managedObjectContext];
    //2.对Clothe的对象属性进行赋值
    cloth.brand=@"Puma";
    int priceCC=arc4random()%1000+1;
    cloth.price=[NSNumber numberWithInt:priceCC];
    //插入数据源数组(数组是可以存储实体对象的)
    [self.dataSource addObject:cloth];
    //插入UI
    [self.tableview insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:self.dataSource.count-1 inSection:0]] withRowAnimation:UITableViewRowAnimationLeft];
    //对数据管理器中的更改进行永久存储
    [self.myAppDelegate saveContext];
    NSLog(@"%@",NSHomeDirectory());

}

@end

六:可视化SQLite文件

(1)所需要的工具:FireFox浏览器的插件

(2)获取数据库文件

 NSLog(@"%@",NSHomeDirectory())

来获取document文件夹地址
注意:要想获得完整的数据库表的数据,以下三个文件一个都不能少!!!@@!

(3)使用火狐插件打开该SQLite文件,通过该文件的形式可以证明我的猜想,生成的实体类即为一张表

该表命名的规则"Z"+"Clothes"(大写转化)


可以可视化预览表中内容,其数据库字段写法为"Z"+"price"(大写转化)和"Z"+"brand"(大写转化)

源码地址:https://github.com/AqiuBeats/SQLiteTest

完毕!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容