iPhone中支持通過sqlite3來訪問iPhone本地的數據庫。
具體使用方法如下
1:添加開發包libsqlite3.0.dylib
首先是設置項目文件,在項目中添加iPhone版的sqlite3的數據庫的開發包,在項目下的Frameworks點擊右鍵,然後選擇libsqlite3.0.dylib文件。
2,代碼中的操作:
那麼接下來是代碼了。
1 首先獲取iPhone上sqlite3的數據庫文件的地址
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);2 打開iPhone上的sqlite3的數據庫文件
sqlite3 *database;3 准備sql文---sql語句
sqlite3_stmt *stmt;4 邦定參數
// 邦定第一個int參數5 執行sql文
sqlite3_step(stmt);6 釋放sql文資源
sqlite3_finalize(stmt);7 關閉iPhone上的sqlite3的數據庫
sqlite3_close(database);
獲取文件的路徑
- (NSString *)getDataBasePath
{
NSString* path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString* filePath = [path stringByAppendingPathComponent:@database.db];
// NSString* filePath = [NSHomeDirectory() stringByAppendingPathComponent:@Document/database.db];
return filePath;
}
打開數據庫
- (void)openDatabase
{
//1、獲取文件路徑
NSString* filePath = [self getDataBasePath];
//2、oc字符串--->c字符串
const char * filename = [filePath UTF8String];
//3、打開數據庫 :如果數據庫文件存在直接打開,不存在,系統會在該路徑下創建同名文件.
//1‘ 數據庫文件名 c字符串
//2‘ 數據庫對象 sqlite3 **ppDb
int rc = sqlite3_open(filename,&_database);
//SQLITE_OK 操作成功
//數據庫打開失敗
if (rc != SQLITE_OK) {
//關閉數據庫:
sqlite3_close(_database);
//插入斷言:如果條件表達式的值為NO,程序崩潰,會輸出參數2的值
//1'<#condition#>條件判斷
//2'desc 程序崩潰後輸出的字符串
NSAssert(NO, @數據庫打開失敗,請檢查文件路徑);
}else{
NSLog(@數據庫打開成功);
}
}
數據表創建
- (IBAction)createTable:(id)sender
{
//1、打開數據庫
[self openDatabase];
//2、創建表的SQL語句: ContactTable
NSString* createSql = @CREATE TABLE ContactTable (name TEXT,phone TEXT) ;
char* errmsg = nil;
//3、執行創建表的sql語句:
//1' 數據庫對象
//2' SQL語句 -C字符串 將OC字符串轉換成C字符串
//3' C語言的回調函數:類似於代理方法,NULL
//4' 回調函數中的第一個參數: NULL
//5' 執行的錯誤信息
int rc = sqlite3_exec(_database, [createSql UTF8String], NULL, NULL, &errmsg);
//SQLITE_OK 執行成功
//表的創建失敗
if (rc != SQLITE_OK) {
NSLog(@數據表創建失敗);
}else{
NSLog(@數據庫表創建成功);
}
//使用完關閉數據庫
sqlite3_close(_database);
}
插入數據
- (IBAction)insertData:(id)sender
{
//1.打開數據庫
[self openDatabase];
//2.SQL語句:?代表字段內容的占位符,有幾個字段需要幾個?
NSString* insertSql = @INSERT INTO ContactTable VALUES(?,?);
//准備一個緩沖區 結構體
sqlite3_stmt * stmt = nil;
//3、准備插入數據:將sql語句轉化成字節碼,並不執行語句
//1' 數據庫對象
//2' sql語句c字符串
//3' sql語句的長度:strlen函數獲取strlen([insertSql UTF8String],此處一般填寫-1,代表從sql語句的第一個字符 讀取到 第一個終止符;讀取完整地sql語句
//4' 語句的緩沖區
//5' pzTail:如果參數3指定的不是完整地sql語句,此參數會保留剩余的部分;NULL
int rc = sqlite3_prepare_v2(_database, [insertSql UTF8String], -1, &stmt, NULL);
//如果數據准備完成 :SQLITE_OK
if (rc == SQLITE_OK) {
//4、將內容綁定到緩存區:
//1' 指定的緩存區
//2' 字段索引:從1開始;默認每一條記錄都會添加一個ROWID
//3' 字段的值:c字符串
//4' 字符串的長度
//5' 函數指針:NULL
NSString* name = @zhangsan;
sqlite3_bind_text(stmt, 1, [name UTF8String], strlen([name UTF8String]),NULL);
NSString* phone = @電話號碼;
sqlite3_bind_text(stmt, 2, [phone UTF8String], strlen([phone UTF8String]), NULL);
//5、執行sql語句,如果綁定過程發生錯誤,會將緩存區的內容置空
int rc = sqlite3_step(stmt);
//執行插入操作是否成功
//SQLITE_DONE:如果執行成功,表示插入一條記錄執行完畢,沒有下一條記錄
//SQLITE_ROW:執行一條記錄完成,還有下一條記錄
if (rc == SQLITE_DONE) {
NSLog(@插入數據成功);
}else{
NSLog(@插入數據失敗____%s,sqlite3_errmsg(_database));
}
//6、釋放緩存區 : 句柄
sqlite3_finalize(stmt);
}
//7、關閉數據庫
sqlite3_close(_database);
}
刪除數據
- (IBAction)deleteData:(id)sender
{
//1、打開數據庫
[self openDatabase];
//2、sql語句
NSString* deleteSql = @DELETE FROM ContactTable WHERE name = 'zhangsan';
//3、緩存區
sqlite3_stmt* stmt = NULL;
//4、准備sql語句
int rc = sqlite3_prepare_v2(_database, [deleteSql UTF8String], strlen([deleteSql UTF8String]), &stmt, NULL);
//5、准備完成,
if (rc == SQLITE_OK) {
//6、執行sql語句
if (sqlite3_step(stmt) == SQLITE_DONE) {
NSLog(@數據刪除完成);
}
//7、釋放緩存區
sqlite3_finalize(stmt);
}
//8、關閉數據庫
sqlite3_close(_database);
}
修改數據
- (IBAction)upDateData:(id)sender
{
//1.打開數據庫
[self openDatabase];
//2.SQL語句
// NSString* updateSql = @UPDATE ContactTable SET phone = '18909091234' WHERE name = 'zhangsan';
NSString* updateSql = @UPDATE ContactTable SET phone = '18909091234' WHERE ROWID = 1;
//3.緩存區
sqlite3_stmt* stmt = NULL;
//4.准備sql
int rc = sqlite3_prepare_v2(_database, [updateSql UTF8String], -1, &stmt, NULL);
//5.准備完成
if (rc == SQLITE_OK) {
//6.執行sql
if (sqlite3_step(stmt) == SQLITE_DONE) {
NSLog(@數據更新成功);
}else{
NSLog(@數據更新失敗);
}
//7.釋放緩存區
sqlite3_finalize(stmt);
}
//8.關閉數據庫
sqlite3_close(_database);
}
查詢
- (IBAction)queryData:(id)sender
{
//裝取出的每一條記錄
NSMutableArray* mArray = [NSMutableArray array];
//1.打開數據庫
[self openDatabase];
//2.sql語句
NSString* querySql = @SELECT * FROM ContactTable;
//3.准備一個緩存區
sqlite3_stmt* stmt = NULL;
//4.准備讀取數據:
int rc = sqlite3_prepare_v2(_database, [querySql UTF8String], -1, &stmt, NULL);
//5.准備完成
if (rc == SQLITE_OK) {
//6.執行sql:如果有多條數據,或者不知道數據庫中有多少行數據,使用while循環執行
//如果執行完畢,返回SQLITE_DONE,不再走while語句;如果還有下一條數據,返回SQLITE_ROW,繼續進入while循環
while (sqlite3_step(stmt) == SQLITE_ROW) {
//7.從緩存區取數據:
//1' 緩存區
//2' 字段索引: 從0開始
char* name = (char *)sqlite3_column_text(stmt, 0);
char * phone =(char *)sqlite3_column_text(stmt, 1);
//將C字符串--->OC字符串
NSString* nameStr = [[NSString alloc] initWithUTF8String:name];
// [NSString stringWithUTF8String:name];
NSString* phoneStr = [[NSString alloc] initWithUTF8String:phone];
//每條記錄都有電話和姓名:放在數組中,一個數據代表一條記錄
[mArray addObject:nameStr];
[mArray addObject:phoneStr];
}
//釋放緩存區:寫在while循環外
sqlite3_finalize(stmt);
}
for (id object in mArray) {
NSLog(@取出的數據為____%@,object);
}
//關閉數據庫
sqlite3_close(_database);
}