iOS开发-xcdatamodeld文件 CoreData的介绍和使用,sqlite的使用
CoreData的介紹和使用?
源引:http://www.jianshu.com/p/d027090af00e
CoreData是數(shù)據(jù)存儲的一種方式,CoreData實(shí)質(zhì)也是對SQLite的封裝。
CoreData是iOS SDK里的一個很強(qiáng)大的框架,允許程序員以面向?qū)ο蟮姆绞絻Υ婧凸芾頂?shù)據(jù)。使用CoreData框架,程序員可以很輕松有效地通過面向?qū)ο蟮慕涌诠芾頂?shù)據(jù)。
CoreData框架提供了對象-關(guān)系映射(ORM)的功能,即能夠?qū)C對象轉(zhuǎn)化成數(shù)據(jù),保存在SQLite3數(shù)據(jù)庫文件中,也能夠?qū)⒈4嬖跀?shù)據(jù)庫中的數(shù)據(jù)還原成OC對象。
在實(shí)際開發(fā)中,新建項(xiàng)目的時候會看到有Use Core Data的選項(xiàng)。
圖1
CoreData和SQLite的最大區(qū)別在于:SQLite使用的是SQL語句,屬于面向過程。而CoreData不適用SQL語句,將這一過程封裝成面向?qū)ο蟆⒈?#xff0c;字段,記錄分別封裝成實(shí)體,屬性和對象,更符合面向?qū)ο蟮乃枷搿?/p>
再回到項(xiàng)目中,新建項(xiàng)目之后會發(fā)現(xiàn)相比較于普通項(xiàng)目,CoreData項(xiàng)目多了一個后綴名為xcdatamodeld的文件
圖2
在AppDelegate.h文件中會多出了三個屬性和兩個方法。還會自動導(dǎo)入CoreData框架
圖3
在AppDelegate.m文件中會多出一些屬性的get方法和方法的實(shí)現(xiàn)(從47行-125行)
圖4
添加實(shí)體
點(diǎn)擊xcdatamodeld文件->點(diǎn)擊AddEntity->再雙擊上方的實(shí)體名,輸入想要的實(shí)體名。(注意:實(shí)體名一定要大寫)
圖5
點(diǎn)擊右側(cè)的Attributes下方的+號可以添加屬性
圖6
添加對象
添加對象之前我們先來了解一下CoreData的主要對象。如下所示:
NSManagedObjectContext:也可以稱為托管對象上下文,負(fù)責(zé)應(yīng)用和數(shù)據(jù)庫之間的交互(CRUD)也就是說用來存東西的。
NSPersistentStoreCoordinator:持久化存儲協(xié)調(diào)器。添加持久化存儲庫(如SQLite數(shù)據(jù)庫),是物理數(shù)據(jù)存儲的物理文件和程序之間的聯(lián)系的橋梁,負(fù)責(zé)管理不同對象上下文,用來存儲上下文的
NSManagedObjectModel:被管理的對象模型,對應(yīng)定義的模型文件。管理對象的屬性(字段)。
NSEntityDescription:實(shí)體描述(往數(shù)據(jù)庫填東西的時候一定要先創(chuàng)建一個實(shí)體描述??梢钥醋鍪侵付ū砻臇|西)
/**
*托管對象上下文,增刪改查都需要它
*/
@property(readonly,strong,nonatomic)NSManagedObjectContext*managedObjectContext;
/**
*托管對象模型文件
*實(shí)際上這個對象就是將xcdatamodel文件和此對象做一個關(guān)聯(lián)。轉(zhuǎn)換出來變?yōu)閷ο?/p>
*/
@property(readonly,strong,nonatomic)NSManagedObjectModel*managedObjectModel;
/**
*持久化儲存協(xié)調(diào)器
*實(shí)際上就是應(yīng)用程序與數(shù)據(jù)庫之間建立的橋梁
*/
@property(readonly,strong,nonatomic)NSPersistentStoreCoordinator*persistentStoreCoordinator;
/**
*保存托管對象上下文的內(nèi)容,增刪改之后都要執(zhí)行此方法
*當(dāng)保存時,托管對象上下文的內(nèi)容就會通過持久化存儲協(xié)調(diào)器進(jìn)行數(shù)據(jù)的保存,并且按照模型文件一一對應(yīng)保存。
*/
- (void)saveContext;
/**
*應(yīng)用程序文檔目錄,也就是CoreData保存的文件的目錄
*
*@return文件保存路徑
*/
- (NSURL*)applicationDocumentsDirectory;
在ViewController里面導(dǎo)入AppDelegate頭文件
- (void)viewDidLoad {
[superviewDidLoad];
//使用CoreData添加數(shù)據(jù)
AppDelegate*appDelegate = [UIApplicationsharedApplication].delegate;
self.manageObjectContext= [appDelegatemanagedObjectContext];
[self insertData];
[self updateData];
}
- (void)insertData {
NSEntityDescription*entity = [NSEntityDescriptionentityForName:@"Person"inManagedObjectContext:self.manageObjectContext];
Person*person = [[Personalloc]initWithEntity:entityinsertIntoManagedObjectContext:self.manageObjectContext];
person.name=@"鋼鐵俠";
person.age=@40;
person.height=@180;
__autoreleasingNSError*error;
[self.manageObjectContextsave:&error];
if(error) {
NSLog(@"數(shù)據(jù)添加失敗");
}else{
NSLog(@"數(shù)據(jù)添加成功");
}
}
修改數(shù)據(jù)的方法:修改數(shù)據(jù)的方法只需要直接修改對象的屬性即可,再保存上下文。
在屬性列表里添加屬性
@property(nonatomic,strong)Person*selectedPerson;
在插入數(shù)據(jù)方法的方法里面將創(chuàng)建的對象賦值給selectedPerson
self.selectedPerson= person;
實(shí)現(xiàn)方法
- (void)updateData{
//修改數(shù)據(jù)
self.selectedPerson.name=@"Mark47";
self.selectedPerson.age=@1;
__autoreleasingNSError*error;
//保存數(shù)據(jù)
[self.manageObjectContextsave:&error];
if(error) {
NSLog(@"數(shù)據(jù)更新失敗");
}else{
NSLog(@"數(shù)據(jù)更新成功");
}
}
刪除數(shù)據(jù):刪除數(shù)據(jù)只要執(zhí)行deleteObject方法,然后在保存上下文即可
- (void) deleteData{
[self.manageObjectContextdeleteObject:self.selectedPerson];
__autoreleasingNSError*error;
[self.manageObjectContextsave:&error];
if(error) {
NSLog(@"數(shù)據(jù)刪除失敗");
}else{
NSLog(@"數(shù)據(jù)刪除成功");
}
}
sqlite的使用
源引:http://www.360doc.com/content/14/1224/22/20918780_435534837.shtml
??
// 使用前需要引入 注意是<>括號,不是雙引號 #import <sqlite3.h>
1 - (void)viewDidLoad {2 [super viewDidLoad];3 // 打開創(chuàng)建數(shù)據(jù)庫4 [self openDataBase];5 // 創(chuàng)建數(shù)據(jù)表6 [self createTables];7 // 插入數(shù)據(jù)8 [self insertData];9 // 查找數(shù)據(jù)10 [self findData]; 11 // 刪除數(shù)據(jù) 12 [self deleteData]; 13 // 修改數(shù)據(jù) 14 [self updataData]; 15 } 16 #pragma mark -打開創(chuàng)建數(shù)據(jù)庫 17 -(void)openDataBase{ 18 // 創(chuàng)建并打開數(shù)據(jù)庫 19 // 獲取數(shù)據(jù)庫的路徑 20 NSString *documentPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 21 // 設(shè)置數(shù)據(jù)庫的路徑和名詞 22 NSString *dataBasePath=[[NSString alloc]initWithString:[documentPath stringByAppendingPathComponent:@"sqlite.sqlite"]]; 23 // 創(chuàng)建并打開數(shù)據(jù)庫 24 int result = sqlite3_open([dataBasePath UTF8String],&db); 25 if(result==SQLITE_OK){ 26 NSLog(@"數(shù)據(jù)庫打開成功"); 27 }else{ 28 NSLog(@"數(shù)據(jù)庫打開失敗。。"); 29 } 30 } 31 #pragma mark -創(chuàng)建數(shù)據(jù)表 32 -(void)createTables{ 33 // sql語句 34 char *sql="create table if not exists t_persons (id integer primary key autoincrement, name text,age integer);"; 35 // 用于保存錯誤信息 36 char *error; 37 // 執(zhí)行創(chuàng)建語句并接收結(jié)果 38 int result=sqlite3_exec(db,sql,NULL,NULL,&error); 39 // 判斷是否創(chuàng)建成功 40 if(result!=SQLITE_OK){ 41 NSLog(@"創(chuàng)建數(shù)據(jù)表失敗~~~~~~~:%s",error); 42 }else { 43 NSLog(@"數(shù)據(jù)表創(chuàng)建成功"); 44 } 45 } 46 #pragma mark -插入數(shù)據(jù) 47 -(void)insertData{ 48 // sql語句 49 char *sql="inser into t_persons(name,age) values(?,?)"; 50 // 存儲的內(nèi)容 51 sqlite3_stmt *stmt; 52 // 執(zhí)行語句并接收結(jié)果 53 int result=sqlite3_prepare_v2(db,sql,-1,&stmt,NULL); 54 // 判斷是否成功 55 if(result==SQLITE_OK){ 56 // 綁定數(shù)據(jù) 57 sqlite3_bind_text(stmt,1,"lidaze",-1,NULL); 58 sqlite3_bind_int(stmt,2,10); 59 // 執(zhí)行插入語句 60 if(sqlite3_step(stmt)==SQLITE_DONE){ 61 NSLog(@"插入成功。。。"); 62 }else{ 63 NSLog(@"插入失敗"); 64 } 65 }else{ 66 NSLog(@"語發(fā)不通過"); 67 } 68 // 釋放stmt 69 sqlite3_finalize(stmt); 70 } 71 #pragma mark -查找數(shù)據(jù) 72 -(void)findData{ 73 // 準(zhǔn)備C語言sql語句 74 char *sql="select * from t_persons"; 75 // 準(zhǔn)備stmt 76 sqlite3_stmt *stmt; 77 // 判斷結(jié)果 78 if(result==SQLITE_OK){//sql語句正確 79 NSLog(@"SQL語句正確"); 80 // 進(jìn)行逐行讀取內(nèi)容 81 while (sqlite3_step(stmt)==SQLITE_ROW){ 82 int ID = sqlite3_column_int(stmt,0); 83 char *name=(char *)sqlite3_column_text(stmt,1); 84 int age=sqlite3_column_int(stmt,2); 85 86 NSLog(@"id:%i,name:%s,age:%i",ID,name,age); 87 } 88 }else{ 89 NSLog(@"sql語句錯誤"); 90 } 91 } 92 #pragma mark -刪除數(shù)據(jù) 93 -(void)deleteData{ 94 // 準(zhǔn)備sql語句 95 char *sql="delete from t_persons where id=?"; 96 // stmt 97 sqlite3_stmt *stmt; 98 // 判斷 sql語句時候通過 99 if(result==SQLITE_OK){ 100 NSLog(@"刪除語句正確"); 101 // 綁定數(shù)據(jù) 102 sqlite3_bind_int(stmt,1,58); 103 // 判斷時候執(zhí)行成功 104 if(sqlite3_step(stmt)==SQLITE_DONE){ 105 NSLog(@"刪除成功"); 106 }else{ 107 NSLog(@"刪除是吧i"); 108 } 109 }else{ 110 NSLog(@"刪除語句錯誤"); 111 } 112 } 113 #pragma mark -修改數(shù)據(jù) 114 -(void)updataData{ 115 // 準(zhǔn)備C語言sql語句 116 char *sql="updata t_persons set name=?,age=18 where id=?;"; 117 // 準(zhǔn)備stmt 118 sqlite3_stmt *stmt; 119 // 執(zhí)行sql語句的判斷 120 int result=sqlite3_prepare(db,sql,-1,&stmt,NULL); 121 // 判斷sql語句的判斷 122 if(result==SQLITE_OK){ 123 NSLog(@"修改語句正確"); 124 // 綁定數(shù)據(jù) 125 sqlite3_bind_text(stmt,1,"Zeeeee",-1,NULL); 126 sqlite3_bind_int(stmt,2,62); 127 // 執(zhí)行并判斷結(jié)果 128 if(sqlite3_step(stmt)==SQLITE_DONE){ 129 NSLog(@"修改成功"); 130 }else{ 131 NSLog(@"修改失敗。。。"); 132 } 133 }else{ 134 NSLog(@"修改語句錯誤。。。"); 135 } 136 } ?
?
轉(zhuǎn)載于:https://www.cnblogs.com/gaozhang12345/p/5992640.html
總結(jié)
以上是生活随笔為你收集整理的iOS开发-xcdatamodeld文件 CoreData的介绍和使用,sqlite的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求哦!我的皇帝陛下百度云资源,不要BT的
- 下一篇: 尼克的任务 dp 洛谷1280