[iOS]30分鐘入門OC-CoreData框架

一:什么是CoreData?

CoreData是蘋果公司封裝的進行數(shù)據(jù)持久化的框架,首次在IOS3.0版本的系統(tǒng)中出現(xiàn),它允許按照實體--屬性--值的模型組織數(shù)據(jù),并以XML,二進制文件或者SQLite數(shù)據(jù)文件的格式持久化數(shù)據(jù)
(1)CoreData不是數(shù)據(jù)庫,它只是操作數(shù)據(jù)庫的框架
(2)CoreData不僅僅可以對數(shù)據(jù)庫進行操作,而且還可以對xml和二進制文件進行操作
(3)可以節(jié)省代碼量,一般要節(jié)省30%到70%的代碼量

二:效果展示

三:基本配置

(1)勾選"Use Core Data"

四:布局配置

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

(2)可視化添加頂部導(dǎo)航欄

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

(3)在組件中搜索"bar"找到item,拖拽到Navigation上面,并且可以對其進行自定義.


樣式,樣色,位置全部都可以進行自定義


(4)添加TableView,找到灰色的"TableView",將其拖拽到ViewController的正中間的位置,其大小可以進行拖拽來進行控制

(5)選擇"Table View",點擊最右鍵,將"dataSource"和"delegate"對"View Controller"進行關(guān)聯(lián)

(6)點擊"Table View"中的"Prototype Cells"屬性,其表示的其實是顯示的列數(shù)


表現(xiàn)為展示的一列


五:數(shù)據(jù)庫操作

(1)數(shù)據(jù)庫添加實體對象:點擊"SQLiteTest.xcdatamodeld"

(2)添加實體對象"Clothes",其實這個實體對象相當于數(shù)據(jù)庫中的表



在該對象(表)中,添加屬性

點擊"Editor"-->"Create NSManagedObject Subclass"-->將會生成關(guān)于"Clohes"的實現(xiàn)

-->

這個地方需要注意,如果在原來的Entity進行重命名,生成的數(shù)據(jù)庫表名仍然為原來的值,唯一的辦法是刪掉重新寫
此外,在"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;
/**
 *  被管理對象上下文(數(shù)據(jù)管理器),相當于一個臨時數(shù)據(jù)庫(可視化建模的文件)
 */
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
/**
 *  被管理對象模型(數(shù)據(jù)模型器)
 */
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
/**
 *  持久化儲存助理(數(shù)據(jù)鏈接器),整個CoreData框架的核心
 */
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
/**
 *  把我們臨時數(shù)據(jù)庫中進行的改變進行永久保存
 */
- (void)saveContext;
/**
 *  獲取真實文件的儲存路徑
 */
- (NSURL *)applicationDocumentsDirectory;


@end

(3)對TableView中的"Cell"進行設(shè)置

在對行數(shù)設(shè)置為1之后



將該cell的樣式設(shè)置為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"

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

@property(nonatomic,strong)NSMutableArray* dataSource;

//聲明一個AppDelegate對象屬性,來調(diào)用類中屬性,比如被管理對象個上下文
@property(nonatomic,strong)AppDelegate* myAppDelegate;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //初始化數(shù)組
    self.dataSource=[NSMutableArray array];
    //初始化AppDelegate
    self.myAppDelegate=[UIApplication sharedApplication].delegate;
    //對TableView加上注冊方法,"cell"表示的是自定義的方法
    [self.tableview registerClass :[UITableViewCell class] forCellReuseIdentifier:@"cell"];
    
#warning 查--查詢數(shù)據(jù)
    //1.NSFetchRequest對象
    NSFetchRequest* request=[[NSFetchRequest alloc]initWithEntityName:@"Clothes"];
    //2.設(shè)置排序
//    //2.1創(chuàng)建排序描述對象(以int類型的價格為例,進行升序排列)
//    NSSortDescriptor *sortFunc=[[NSSortDescriptor alloc]initWithKey:@"price" ascending:YES];
//    request.sortDescriptors=@[sortFunc];
    //3.執(zhí)行這個查詢請求
    NSError* error=nil;
    NSArray *arr=[self.myAppDelegate.managedObjectContext executeFetchRequest:request error:&error];
    //給數(shù)據(jù)源數(shù)組中添加數(shù)據(jù)
    [self.dataSource addObjectsFromArray:arr];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
//tableView的delegate和dataSource的方法
/**
 *  返回分區(qū)中的行數(shù),相當于listview的item數(shù)目
 */
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return self.dataSource.count;
}
/**
 *  返回分區(qū)的個數(shù)
 */
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}
/**
 *  對每個cell進行構(gòu)造,相當于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 刪--刪除數(shù)據(jù),并對視圖進行實時更新
        //刪除數(shù)據(jù)源
        Clothes *cloth=self.dataSource[indexPath.row];
        [self.dataSource removeObject:cloth];
        //刪除數(shù)據(jù)管理中的數(shù)據(jù)
        [self.myAppDelegate.managedObjectContext deleteObject:cloth];
        //將刪除的更改進行永久保存
        [self.myAppDelegate saveContext];
        //刪除單元格
        [self.tableview deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
        
    }
}
#warning 改--更改數(shù)據(jù)的屬性值,并對視圖進行實時更新
//點擊cell來修改數(shù)據(jù)
-(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.對數(shù)據(jù)的更改進行永久的保存
    [self.myAppDelegate saveContext];
}

/**
 *  插入數(shù)據(jù)
 */
- (IBAction)addModel:(id)sender {
#warning 增--插入數(shù)據(jù)
    //創(chuàng)建實體描述
    NSEntityDescription* description=[NSEntityDescription entityForName:@"Clothes" inManagedObjectContext:self.myAppDelegate.managedObjectContext];
    //1.先創(chuàng)建一個模型對象
    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];
    //插入數(shù)據(jù)源數(shù)組(數(shù)組是可以存儲實體對象的)
    [self.dataSource addObject:cloth];
    //插入UI
    [self.tableview insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:self.dataSource.count-1 inSection:0]] withRowAnimation:UITableViewRowAnimationLeft];
    //對數(shù)據(jù)管理器中的更改進行永久存儲
    [self.myAppDelegate saveContext];
    NSLog(@"%@",NSHomeDirectory());

}

@end

六:可視化SQLite文件

(1)所需要的工具:FireFox瀏覽器的插件

(2)獲取數(shù)據(jù)庫文件

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

來獲取document文件夾地址
注意:要想獲得完整的數(shù)據(jù)庫表的數(shù)據(jù),以下三個文件一個都不能少!!!@@!

(3)使用火狐插件打開該SQLite文件,通過該文件的形式可以證明我的猜想,生成的實體類即為一張表

該表命名的規(guī)則"Z"+"Clothes"(大寫轉(zhuǎn)化)


可以可視化預(yù)覽表中內(nèi)容,其數(shù)據(jù)庫字段寫法為"Z"+"price"(大寫轉(zhuǎn)化)和"Z"+"brand"(大寫轉(zhuǎn)化)

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

完畢!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妨蛹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌揍障,老刑警劉巖限番,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件括蝠,死亡現(xiàn)場離奇詭異会前,居然都是意外死亡姥闪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門肌毅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筷转,“玉大人,你說我怎么就攤上這事悬而∥厥妫” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵笨奠,是天一觀的道長袭蝗。 經(jīng)常有香客問我,道長般婆,這世上最難降的妖魔是什么到腥? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蔚袍,結(jié)果婚禮上左电,老公的妹妹穿的比我還像新娘。我一直安慰自己页响,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布段誊。 她就那樣靜靜地躺著闰蚕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪连舍。 梳的紋絲不亂的頭發(fā)上没陡,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音,去河邊找鬼盼玄。 笑死贴彼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的埃儿。 我是一名探鬼主播器仗,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼童番!你這毒婦竟也來了精钮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤剃斧,失蹤者是張志新(化名)和其女友劉穎轨香,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幼东,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡臂容,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了根蟹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脓杉。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖娜亿,靈堂內(nèi)的尸體忽然破棺而出丽已,到底是詐尸還是另有隱情,我是刑警寧澤买决,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布沛婴,位于F島的核電站,受9級特大地震影響督赤,放射性物質(zhì)發(fā)生泄漏嘁灯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一躲舌、第九天 我趴在偏房一處隱蔽的房頂上張望丑婿。 院中可真熱鬧,春花似錦没卸、人聲如沸羹奉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诀拭。三九已至,卻和暖如春煤蚌,著一層夾襖步出監(jiān)牢的瞬間耕挨,已是汗流浹背细卧。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留筒占,地道東北人贪庙。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像翰苫,于是被迫代替她去往敵國和親止邮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫革骨、插件农尖、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • Swift版本點擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,374評論 7 249
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議筑凫。它實...
    香橙柚子閱讀 23,860評論 8 183
  • 先下了火車滑沧,才覺得江南與我想得非同一般,我劃一根火柴巍实,照亮路邊的指示牌滓技,也點著嘴邊的煙,這是我在江南所抽的第一支煙...
    剪秋風(fēng)閱讀 158評論 1 3
  • 本周的狀態(tài)非常不好棚潦,事情比較多令漂,兼職不順,我身體不適丸边,還因為一些事叠必,半夜總是哭醒。白天整個人處于沒精打采的狀態(tài)∶媒眩現(xiàn)...
    Z劉巧燕P閱讀 208評論 1 0