一、在哪一個目錄下建立數據庫,就會在該目錄下保存數據庫
SQLite的不足:
一、還不支持外鍵約束,(3.6版本如下)
管理工具:
d、SQLite Analyzer的工具:得到關於物理的數據庫結構信息,SQLite 網站上下載
e、NavicatPremium11-1-12.dmg
在iOS使用SQLite
放置位置在SandBox中的Documents
採用SQLite數據庫來存儲數據。
SQLite做爲一中小型數據庫,應用ios中,跟前三種保存方式相比,相對比較複雜一些。
第一步:準備工做
一、導入庫:libsqlite3.dylib(若是沒有導入,會報各類錯誤)
二、在項目中添加頭文件
#import "sqlite3.h"
第二步:開始使用SQLite:
使用前注意:若是不往數據庫裏面添加任何的表,這個數據庫等於沒有創建,不會在硬盤上產生任何文件,若是數據庫已經存在,則會打開這個數據庫。
過程:
一、準備數據庫路徑,建立或打開數據庫,成功會返回打開的數據庫:sqlite3_open
二、建立或打開表,若是沒有就建立
執行SQL語句的方法:sqlite3_exec
三、插入數據
四、關閉數據庫
//1. 準備SQLite數據庫文件的路徑
NSString *dbPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]stringByAppendingPathComponent:@"demo1.db"];
NSLog(@"%@", dbPath);
//2. 建立或打開數據庫,若是打開數據庫成功,db這個指針就會指向打開的數據庫.
sqlite3 *db = NULL;
int res = sqlite3_open(dbPath.UTF8String, &db);//由於是C語言的API,以此要使用C語言數據類型
if(res != SQLITE_OK){// #define SQLITE_OK 0 成功返回零
NSLog(@"打開或建立數據庫失敗:%s", sqlite3_errmsg(db));
return;
}
NSLog(@"數據庫打開成功");
//3. 建立一張表3.1 準備建表的SQL語句,IF NOT EXISTS:若是不存在就....
const char* sql = "CREATE TABLE IF NOT EXISTS persons (id integer PRIMARY KEY, name varchar(20), age int, salary double)";
//3.2 執行SQL語句
char *errmsg = NULL;
res = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if(res != SQLITE_OK) {
NSLog(@"SQL執行失敗:%s", errmsg);
}
//4. 插入數據
sql = "INSERT INTO persons(name, age, salary) VALUES('Guodh', 31, 120000)";
res = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if(res != SQLITE_OK){
NSLog(@"插入數據失敗:%s", errmsg);
}
//5. 釋放數據庫及其餘資源
sqlite3_close(db);
//errmsg指向的信息在堆中存放,因此也須要釋放
sqlite3_free(errmsg);
//注:插入數據,是咱們預寫好的語句,可是實際中,咱們的數據是變更的,所以,也就不能這麼寫了。
使用另外的方法:預編譯SQL語句
//3. 保存數據
for(int i=0; i<self.lineFields.count; i++){
//2.1 準備保存數據的SQL語句
const char* sql = "INSERT OR REPLACE INTO lines(row, field_text) VALUES (?, ?)";
//2.2 預編譯SQL語句
sqlite3_stmt *stmt = nil;//用來保存預編譯結果的對象
res = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if(res == SQLITE_OK){//預編譯成功
sqlite3_bind_int(stmt, 1, i);//給第一個?綁定值(stmt, 第一個?, 值)
UITextField *field = self.lineFields[i];
sqlite3_bind_text(stmt, 2, field.text.UTF8String, -1, NULL);//給第二個?綁定值
}
//2.3 執行SQL語句
sqlite3_step(stmt);
//2.4結束SQL語句的執行
sqlite3_finalize(stmt);
}
//4. 關閉數據庫
sqlite3_close(db);
讀取數據庫中的內容
//2.1 打開數據庫
sqlite3 *db = NULL;
if(sqlite3_open(self.dbPath.UTF8String, &db) != SQLITE_OK){
NSLog(@"打開數據庫失敗");
}
//2.2 準備SQL語句
const char* sql = "SELECT row, field_text FROM lines ORDER BY row";
//2.3 拿到SQL語句執行的結果,顯示到界面
sqlite3_stmt *stmt = NULL;
if(sqlite3_prepare_v2(db, sql, -1, &stmt, NULL)==SQLITE_OK){
//從結果中一條一條的拿記錄
while(sqlite3_step(stmt)==SQLITE_ROW){//獲取到一條記錄
//從這條記錄中拿第一個字段的值
int row = sqlite3_column_int(stmt, 0);//須要指定要讀取的數據類型,儘管知道它是什麼類型的
//第二個字段的值
char* data = (char*)sqlite3_column_text(stmt, 1);
//將數據顯示到對應的TextField上
UITextField *field = self.lineFields[row];
field.text = [NSString stringWithFormat:@"%s", data];
}
sqlite3_finalize(stmt);
}
sqlite3_close(db);
注意:寫入數據庫,字符串能夠採用char方式,而從數據庫中取出char類型,當char類型有表示中文字符 時,會出現亂碼。這是由於數據庫默認使用ascII編碼方式。因此要想正確從數據庫中取出中文,須要用 NSString來接收從數據庫取出的字符串。