[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閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容