iOS開發-xcdatamodeld文件 CoreData的介紹和使用,sqlite的使用


CoreData的介紹和使用 

源引:http://www.jianshu.com/p/d027090af00e

CoreData是數據存儲的一種方式,CoreData實質也是對SQLite的封裝。

CoreData是iOS SDK里的一個很強大的框架,允許程序員以面向對象的方式儲存和管理數據。使用CoreData框架,程序員可以很輕松有效地通過面向對象的接口管理數據。

CoreData框架提供了對象-關系映射(ORM)的功能,即能夠將OC對象轉化成數據,保存在SQLite3數據庫文件中,也能夠將保存在數據庫中的數據還原成OC對象。

在實際開發中,新建項目的時候會看到有Use Core Data的選項。


圖1

CoreData和SQLite的最大區別在於:SQLite使用的是SQL語句,屬於面向過程。而CoreData不適用SQL語句,將這一過程封裝成面向對象。將表,字段,記錄分別封裝成實體,屬性和對象,更符合面向對象的思想。

再回到項目中,新建項目之后會發現相比較於普通項目,CoreData項目多了一個后綴名為xcdatamodeld的文件


圖2

在AppDelegate.h文件中會多出了三個屬性和兩個方法。還會自動導入CoreData框架


圖3

在AppDelegate.m文件中會多出一些屬性的get方法和方法的實現(從47行-125行)


圖4

添加實體

點擊xcdatamodeld文件->點擊AddEntity->再雙擊上方的實體名,輸入想要的實體名。(注意:實體名一定要大寫)


圖5

點擊右側的Attributes下方的+號可以添加屬性


圖6

添加對象

添加對象之前我們先來了解一下CoreData的主要對象。如下所示:

NSManagedObjectContext:也可以稱為托管對象上下文,負責應用和數據庫之間的交互(CRUD)也就是說用來存東西的。

NSPersistentStoreCoordinator:持久化存儲協調器。添加持久化存儲庫(如SQLite數據庫),是物理數據存儲的物理文件和程序之間的聯系的橋梁,負責管理不同對象上下文,用來存儲上下文的

NSManagedObjectModel:被管理的對象模型,對應定義的模型文件。管理對象的屬性(字段)。

NSEntityDescription:實體描述(往數據庫填東西的時候一定要先創建一個實體描述。可以看做是指定表名的東西)

/**

*托管對象上下文,增刪改查都需要它

*/

@property(readonly,strong,nonatomic)NSManagedObjectContext*managedObjectContext;

/**

*托管對象模型文件

*實際上這個對象就是將xcdatamodel文件和此對象做一個關聯。轉換出來變為對象

*/

@property(readonly,strong,nonatomic)NSManagedObjectModel*managedObjectModel;

/**

*持久化儲存協調器

*實際上就是應用程序與數據庫之間建立的橋梁

*/

@property(readonly,strong,nonatomic)NSPersistentStoreCoordinator*persistentStoreCoordinator;

/**

*保存托管對象上下文的內容,增刪改之后都要執行此方法

*當保存時,托管對象上下文的內容就會通過持久化存儲協調器進行數據的保存,並且按照模型文件一一對應保存。

*/

- (void)saveContext;

/**

*應用程序文檔目錄,也就是CoreData保存的文件的目錄

*

*@return文件保存路徑

*/

- (NSURL*)applicationDocumentsDirectory;

在ViewController里面導入AppDelegate頭文件

- (void)viewDidLoad {

[superviewDidLoad];

//使用CoreData添加數據

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(@"數據添加失敗");

}else{

NSLog(@"數據添加成功");

}

}

修改數據的方法:修改數據的方法只需要直接修改對象的屬性即可,再保存上下文。

在屬性列表里添加屬性

@property(nonatomic,strong)Person*selectedPerson;

在插入數據方法的方法里面將創建的對象賦值給selectedPerson

self.selectedPerson= person;

實現方法

- (void)updateData{

//修改數據

self.selectedPerson.name=@"Mark47";

self.selectedPerson.age=@1;

__autoreleasingNSError*error;

//保存數據

[self.manageObjectContextsave:&error];

if(error) {

NSLog(@"數據更新失敗");

}else{

NSLog(@"數據更新成功");

}

}

刪除數據:刪除數據只要執行deleteObject方法,然后在保存上下文即可

- (void) deleteData{

[self.manageObjectContextdeleteObject:self.selectedPerson];

__autoreleasingNSError*error;

[self.manageObjectContextsave:&error];

if(error) {

NSLog(@"數據刪除失敗");

}else{

NSLog(@"數據刪除成功");

}

}

sqlite的使用

源引:http://www.360doc.com/content/14/1224/22/20918780_435534837.shtml

 

 

// 使用前需要引入 注意是<>括號,不是雙引號
#import <sqlite3.h>
  1 - (void)viewDidLoad {
  2  [super viewDidLoad]; 3 // 打開創建數據庫 4  [self openDataBase]; 5 // 創建數據表 6  [self createTables]; 7 // 插入數據 8  [self insertData]; 9 // 查找數據 10  [self findData]; 11 // 刪除數據 12  [self deleteData]; 13 // 修改數據 14  [self updataData]; 15 } 16 #pragma mark -打開創建數據庫 17 -(void)openDataBase{ 18 // 創建並打開數據庫 19 // 獲取數據庫的路徑 20 NSString *documentPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 21 // 設置數據庫的路徑和名詞 22 NSString *dataBasePath=[[NSString alloc]initWithString:[documentPath stringByAppendingPathComponent:@"sqlite.sqlite"]]; 23 // 創建並打開數據庫 24 int result = sqlite3_open([dataBasePath UTF8String],&db); 25 if(result==SQLITE_OK){ 26 NSLog(@"數據庫打開成功"); 27 }else{ 28 NSLog(@"數據庫打開失敗。。"); 29  } 30 } 31 #pragma mark -創建數據表 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 // 執行創建語句並接收結果 38 int result=sqlite3_exec(db,sql,NULL,NULL,&error); 39 // 判斷是否創建成功 40 if(result!=SQLITE_OK){ 41 NSLog(@"創建數據表失敗~~~~~~~:%s",error); 42 }else { 43 NSLog(@"數據表創建成功"); 44  } 45 } 46 #pragma mark -插入數據 47 -(void)insertData{ 48 // sql語句 49 char *sql="inser into t_persons(name,age) values(?,?)"; 50 // 存儲的內容 51 sqlite3_stmt *stmt; 52 // 執行語句並接收結果 53 int result=sqlite3_prepare_v2(db,sql,-1,&stmt,NULL); 54 // 判斷是否成功 55 if(result==SQLITE_OK){ 56 // 綁定數據 57 sqlite3_bind_text(stmt,1,"lidaze",-1,NULL); 58 sqlite3_bind_int(stmt,2,10); 59 // 執行插入語句 60 if(sqlite3_step(stmt)==SQLITE_DONE){ 61 NSLog(@"插入成功。。。"); 62 }else{ 63 NSLog(@"插入失敗"); 64  } 65 }else{ 66 NSLog(@"語發不通過"); 67  } 68 // 釋放stmt 69  sqlite3_finalize(stmt); 70 } 71 #pragma mark -查找數據 72 -(void)findData{ 73 // 准備C語言sql語句 74 char *sql="select * from t_persons"; 75 // 准備stmt 76 sqlite3_stmt *stmt; 77 // 判斷結果 78 if(result==SQLITE_OK){//sql語句正確 79 NSLog(@"SQL語句正確"); 80 // 進行逐行讀取內容 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 -刪除數據 93 -(void)deleteData{ 94 // 准備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 // 綁定數據 102 sqlite3_bind_int(stmt,1,58); 103 // 判斷時候執行成功 104 if(sqlite3_step(stmt)==SQLITE_DONE){ 105 NSLog(@"刪除成功"); 106 }else{ 107 NSLog(@"刪除是吧i"); 108  } 109 }else{ 110 NSLog(@"刪除語句錯誤"); 111  } 112 } 113 #pragma mark -修改數據 114 -(void)updataData{ 115 // 准備C語言sql語句 116 char *sql="updata t_persons set name=?,age=18 where id=?;"; 117 // 准備stmt 118 sqlite3_stmt *stmt; 119 // 執行sql語句的判斷 120 int result=sqlite3_prepare(db,sql,-1,&stmt,NULL); 121 // 判斷sql語句的判斷 122 if(result==SQLITE_OK){ 123 NSLog(@"修改語句正確"); 124 // 綁定數據 125 sqlite3_bind_text(stmt,1,"Zeeeee",-1,NULL); 126 sqlite3_bind_int(stmt,2,62); 127 // 執行並判斷結果 128 if(sqlite3_step(stmt)==SQLITE_DONE){ 129 NSLog(@"修改成功"); 130 }else{ 131 NSLog(@"修改失敗。。。"); 132  } 133 }else{ 134 NSLog(@"修改語句錯誤。。。"); 135  } 136 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM