iOS sqlite並不難(呵呵,難了不會,會了不難) 分類: ios開發 2014-12-20 16:54 196人閱讀 評論(0) 收藏

衆所周知,sqlite3是ios數據存儲其一,具體優勢和缺點,我就再也不贅述,請你們搜索之。java



1、必備條件ios

在ios項目中使用sqlite須要添加  libsqlite3.dylib 庫sql



2、簡單介紹經常使用方法數據庫

sqlite3          *db, 數據庫句柄,跟文件句柄FILE很相似
sqlite3_stmt      *stmt, 這個至關於ODBC的Command對象,用於保存編譯好的SQL語句
sqlite3_open(),   打開數據庫,沒有數據庫時建立。
sqlite3_exec(),   執行非查詢的sql語句
Sqlite3_step(), 在調用sqlite3_prepare後,使用這個函數在記錄集中移動。
Sqlite3_close(), 關閉數據庫文件
還有一系列的函數,用於從記錄集字段中獲取數據,如
sqlite3_column_text(), 取text類型的數據。
sqlite3_column_blob(),取blob類型的數據
sqlite3_column_int(), 取int類型的數據
app


3、建立(或打開)數據庫ide

3-1首先自定義一個方法,返回咱們當前應用程序沙盒目錄(也就是說但願數據庫保存在哪裏)函數

[cpp]  view plain copy
  1. -(NSString *) dataFilePath{  
  2.   
  3.    NSArray *path =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  4.   
  5.     NSString *document = [path objectAtIndex:0];  
  6.   
  7.     return [document stringByAppendingPathComponent:TABLENAME];//'persion.sqlite'  
  8.   
  9. }  

3-2 在指定位置 建立或打開一個數據庫

SQLITE_OK是sqlite3的一個常量,表明操做執行成功spa

[java]  view plain copy
  1. //SQLite3  
  2.   
  3. sqlite3 *database;  
  4. if (sqlite3_open([[self dataFilePath] UTF8String], &database)!=SQLITE_OK) {  
  5.     sqlite3_close(database);  
  6.     NSAssert(0, @"open database faid!");  
  7.     NSLog(@"數據庫建立失敗!");  
  8. }  

【注意】因爲sqlite3是基於C語言編寫的,而不是純粹的object-c,因此有關字符串,咱們不能使用NSString,由於它不識別,因此只能用c語言的字符串,char*,好在Nsstring提供了轉換的方法,那就是 UTF8String。


上圖即是咱們建立的數據庫在app中的指定位置。.net




4、建立一張表orm

[cpp]  view plain copy
  1. NSString *ceateSQL = @"CREATE TABLE IF NOT EXISTS PERSIONINFO(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, AGE INTEGER, SEX TEXT, WEIGHT INTEGER, ADDRESS TEXT)";  
  2.   
  3. char *ERROR;  
  4.   
  5. if (sqlite3_exec(database, [ceateSQL UTF8String], NULL, NULL, &ERROR)!=SQLITE_OK){  
  6.     sqlite3_close(database);  
  7.     NSAssert(0, @"ceate table faild!");  
  8.     NSLog(@"表建立失敗");  
  9. }  
我建立了一張名爲PERSIONINFO的數據庫表,其中有一個自增的ID,和NAME,AGE,SEX,WEIGTH,ADDRESS五個屬性。


5、查詢表數據

[cpp]  view plain copy
  1. NSString *quary = @"SELECT * FROM PERSIONINFO";//SELECT ROW,FIELD_DATA FROM FIELDS ORDER BY ROW  
  2. sqlite3_stmt *stmt;  
  3. if (sqlite3_prepare_v2(database, [quary UTF8String], -1, &stmt, nil) == SQLITE_OK) {  
  4.       
  5.     while (sqlite3_step(stmt)==SQLITE_ROW) {  
  6.           
  7.         char *name = (char *)sqlite3_column_text(stmt, 1);  
  8.         NSString *nameString = [[NSString alloc] initWithUTF8String:name];  
  9.         self.nameTextField.text = nameString;  
  10.         [nameString release];  
  11.           
  12.         int age = sqlite3_column_int(stmt, 2);  
  13.         self.ageTextField.text = [NSString stringWithFormat:@"%d",age];  
  14.           
  15.         char *sex = (char *)sqlite3_column_text(stmt, 3);  
  16.         NSString *sexString = [[NSString alloc] initWithUTF8String:sex];  
  17.         self.sexTextField.text = sexString;  
  18.         [sexString release];  
  19.           
  20.         int weight = sqlite3_column_int(stmt, 4);  
  21.         self.weightTextField.text = [NSString stringWithFormat:@"%d",weight];  
  22.           
  23.           
  24.         char *address = (char *)sqlite3_column_text(stmt, 5);  
  25.         NSString *addressString = [[NSString alloc] initWithUTF8String:address];  
  26.         self.addressTextField.text = addressString;  
  27.         [addressString release];  
  28.           
  29.           
  30.     }  
  31.       
  32.     sqlite3_finalize(stmt);  
  33. }  
  34. //用完了必定記得關閉,釋放內存  
  35. sqlite3_close(database);  
sqlite3_prepare_v2是執行查詢的方法,當查詢語句執行成功時,使用sqlite3_step當遊標指向每一行SQLITE_ROW時,咱們開始讀取數據

sqlite_3_column_text能夠讀取字符串類型的數據,參數二爲column號,sqlite_3column_int讀取int類型數據,其它的就不舉例了,你們能夠嘗試。



6、保存,插入數據

[cpp]  view plain copy
  1. char *update = "INSERT OR REPLACE INTO PERSIONINFO(NAME,AGE,SEX,WEIGHT,ADDRESS)""VALUES(?,?,?,?,?);";  
  2. //上邊的update也能夠這樣寫:  
  3. //NSString *insert = [NSString stringWithFormat:@"INSERT OR REPLACE INTO PERSIONINFO('%@','%@','%@','%@','%@')VALUES(?,?,?,?,?)",NAME,AGE,SEX,WEIGHT,ADDRESS];  
  4.   
  5. char *errorMsg = NULL;  
  6. sqlite3_stmt *stmt;  
  7.   
  8. if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) {  
  9.       
  10.     //【插入數據】在這裏咱們使用綁定數據的方法,參數一:sqlite3_stmt,參數二:插入列號,參數三:插入的數據,參數四:數據長度(-1表明所有),參數五:是否須要回調  
  11.     sqlite3_bind_text(stmt, 1, [self.nameTextField.text UTF8String], -1, NULL);  
  12.     sqlite3_bind_int(stmt, 2, [self.ageTextField.text intValue]);  
  13.     sqlite3_bind_text(stmt, 3, [self.sexTextField.text UTF8String], -1, NULL);  
  14.     sqlite3_bind_int(stmt, 4, [self.weightTextField.text integerValue]);  
  15.     sqlite3_bind_text(stmt, 5, [self.addressTextField.text UTF8String], -1, NULL);  
  16. }  
  17. if (sqlite3_step(stmt) != SQLITE_DONE)  
  18. NSLog(@"數據更新失敗");  
  19. NSAssert(0, @"error updating :%s",errorMsg);  
  20.   
  21.  sqlite3_finalize(stmt);  
  22.   
  23. sqlite3_close(database);  

固然,你也能夠用你們熟知的,直接把數據寫在要執行的sql語句後面,以下:

[cpp]  view plain copy
  1. NSString *insert = [NSString stringWithFormat:@"INSERT OR REPLACE INTO PERSIONINFO('%@','%@','%@','%@','%@')VALUES('%@','%d','%@','%d','%@')",NAME,AGE,SEX,WEIGHT,ADDRESS,@"小楊",23,@"man",65,@"中國北京,haidian,shangdi,xinxiRoad,100014"];  
  2.   
  3. //執行語句  
  4. if (sqlite3_exec(database, [insert UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {  
  5.     sqlite3_close(database);  
  6. }  

這樣看着是否是就輕鬆不少了呢?



七:運行效果:



demo中我在每回打開APP時,在viewdidload裏,讀取數據庫,若是有數據,賦值到相應的屬性,當用戶按下home鍵後,及時保存當前數據。也就是說,模擬一個遊戲,當咱們來電話時或是按下home鍵作別的事情時,必定要爲用戶保存當前進度和數據,否則下次打開遊戲,又歸零了?


demo地址:

http://download.csdn.net/detail/mad1989/5752207

相關文章
相關標籤/搜索