衆所周知,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首先自定義一個方法,返回咱們當前應用程序沙盒目錄(也就是說但願數據庫保存在哪裏)函數
- -(NSString *) dataFilePath{
-
- NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
-
- NSString *document = [path objectAtIndex:0];
-
- return [document stringByAppendingPathComponent:TABLENAME];
-
- }
3-2 在指定位置 建立或打開一個數據庫
SQLITE_OK是sqlite3的一個常量,表明操做執行成功spa
-
-
- sqlite3 *database;
- if (sqlite3_open([[self dataFilePath] UTF8String], &database)!=SQLITE_OK) {
- sqlite3_close(database);
- NSAssert(0, @"open database faid!");
- NSLog(@"數據庫建立失敗!");
- }
【注意】因爲sqlite3是基於C語言編寫的,而不是純粹的object-c,因此有關字符串,咱們不能使用NSString,由於它不識別,因此只能用c語言的字符串,char*,好在Nsstring提供了轉換的方法,那就是 UTF8String。
上圖即是咱們建立的數據庫在app中的指定位置。.net
4、建立一張表orm
- NSString *ceateSQL = @"CREATE TABLE IF NOT EXISTS PERSIONINFO(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, AGE INTEGER, SEX TEXT, WEIGHT INTEGER, ADDRESS TEXT)";
-
- char *ERROR;
-
- if (sqlite3_exec(database, [ceateSQL UTF8String], NULL, NULL, &ERROR)!=SQLITE_OK){
- sqlite3_close(database);
- NSAssert(0, @"ceate table faild!");
- NSLog(@"表建立失敗");
- }
我建立了一張名爲PERSIONINFO的數據庫表,其中有一個自增的ID,和NAME,AGE,SEX,WEIGTH,ADDRESS五個屬性。
5、查詢表數據
- NSString *quary = @"SELECT * FROM PERSIONINFO";
- sqlite3_stmt *stmt;
- if (sqlite3_prepare_v2(database, [quary UTF8String], -1, &stmt, nil) == SQLITE_OK) {
-
- while (sqlite3_step(stmt)==SQLITE_ROW) {
-
- char *name = (char *)sqlite3_column_text(stmt, 1);
- NSString *nameString = [[NSString alloc] initWithUTF8String:name];
- self.nameTextField.text = nameString;
- [nameString release];
-
- int age = sqlite3_column_int(stmt, 2);
- self.ageTextField.text = [NSString stringWithFormat:@"%d",age];
-
- char *sex = (char *)sqlite3_column_text(stmt, 3);
- NSString *sexString = [[NSString alloc] initWithUTF8String:sex];
- self.sexTextField.text = sexString;
- [sexString release];
-
- int weight = sqlite3_column_int(stmt, 4);
- self.weightTextField.text = [NSString stringWithFormat:@"%d",weight];
-
-
- char *address = (char *)sqlite3_column_text(stmt, 5);
- NSString *addressString = [[NSString alloc] initWithUTF8String:address];
- self.addressTextField.text = addressString;
- [addressString release];
-
-
- }
-
- sqlite3_finalize(stmt);
- }
-
- sqlite3_close(database);
sqlite3_prepare_v2是執行查詢的方法,當查詢語句執行成功時,使用sqlite3_step當遊標指向每一行SQLITE_ROW時,咱們開始讀取數據
sqlite_3_column_text能夠讀取字符串類型的數據,參數二爲column號,sqlite_3column_int讀取int類型數據,其它的就不舉例了,你們能夠嘗試。
6、保存,插入數據
- char *update = "INSERT OR REPLACE INTO PERSIONINFO(NAME,AGE,SEX,WEIGHT,ADDRESS)""VALUES(?,?,?,?,?);";
-
-
-
- char *errorMsg = NULL;
- sqlite3_stmt *stmt;
-
- if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) {
-
-
- sqlite3_bind_text(stmt, 1, [self.nameTextField.text UTF8String], -1, NULL);
- sqlite3_bind_int(stmt, 2, [self.ageTextField.text intValue]);
- sqlite3_bind_text(stmt, 3, [self.sexTextField.text UTF8String], -1, NULL);
- sqlite3_bind_int(stmt, 4, [self.weightTextField.text integerValue]);
- sqlite3_bind_text(stmt, 5, [self.addressTextField.text UTF8String], -1, NULL);
- }
- if (sqlite3_step(stmt) != SQLITE_DONE)
- NSLog(@"數據更新失敗");
- NSAssert(0, @"error updating :%s",errorMsg);
-
- sqlite3_finalize(stmt);
-
- sqlite3_close(database);
固然,你也能夠用你們熟知的,直接把數據寫在要執行的sql語句後面,以下:
- NSString *insert = [NSString stringWithFormat:@"INSERT OR REPLACE INTO PERSIONINFO('%@','%@','%@','%@','%@')VALUES('%@','%d','%@','%d','%@')",NAME,AGE,SEX,WEIGHT,ADDRESS,@"小楊",23,@"man",65,@"中國北京,haidian,shangdi,xinxiRoad,100014"];
-
-
- if (sqlite3_exec(database, [insert UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
- sqlite3_close(database);
- }
這樣看着是否是就輕鬆不少了呢?
七:運行效果:
demo中我在每回打開APP時,在viewdidload裏,讀取數據庫,若是有數據,賦值到相應的屬性,當用戶按下home鍵後,及時保存當前數據。也就是說,模擬一個遊戲,當咱們來電話時或是按下home鍵作別的事情時,必定要爲用戶保存當前進度和數據,否則下次打開遊戲,又歸零了?
demo地址:
http://download.csdn.net/detail/mad1989/5752207