SQLite可視化工具:SQLite Professional
新建Project,添加SQLite3庫文件
因爲是Demo,所以一切從簡,只實現最簡單的操作
首先定義一個全局的句柄
static sqlite3 * db = nil; //設置句柄 通過句柄對數據庫進行操作
打開數據庫連接,並且創建表格
-(void)openDB{
NSArray *test = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
/*
directory 目錄類型 比如Documents目錄 就是NSDocumentDirectory
domainMask 在iOS的程序中這個取NSUserDomainMask
expandTilde YES,表示將~展開成完整路徑
*/
NSString * fileName = [[test lastObject]stringByAppendingPathComponent:@"DB_ichampion.sqlite"];
// lastObject 取NSSearchPathForDirectoriesInDomains數組最後一個元素
NSLog(@"%@",fileName);
//打開數據庫 如果沒有打開的數據庫就建立一個
//第一個參數是數據庫的路徑 注意要轉換爲c的字符串
if (sqlite3_open(fileName.UTF8String, &db) == SQLITE_OK) {
NSLog(@"打開數據庫成功");
//打開數據庫成功後建立數據庫內的表
//操作命令的字符串
//注意SQL語句結束處有 ; 號
NSString * sql = @"create table if not exists Table_ichampion (id integer primary key autoincrement,name text,age intger);";
char * err;
sqlite3_exec(db, sql.UTF8String, NULL, NULL, &err);
if (err) {
NSLog(@"建表失敗 -- %s",err);
}else{
NSLog(@"建表成功");
}
}else{
NSLog(@"打開數據庫失敗");
}
}
運行完成以後,打印輸出SQLite文件路徑,通過路徑查找到.SQLite文件,用SQLite Professional打開
可以看到表格就算新建好了
創建完表格則需要插入數據,這裏一共插入了4條記錄,但是總的來說寫法就兩大種,前面三條記錄只是SQL語句的不同
-(void)insertDB{
char * err;
NSString * sql = @"insert into Table_ichampion(id,name,age) values(1,'Zhan',18);";
printf("%d",sqlite3_exec(db, sql.UTF8String, NULL, NULL, &err));
NSString * sql1 = @"insert into Table_ichampion(id,name,age) values(3,'Michael',8);";
sqlite3_exec(db, sql1.UTF8String, NULL, NULL, &err);
NSString * sql2 = @"insert into Table_ichampion values(NULL,'abc',6);";
sqlite3_exec(db, sql2.UTF8String, NULL, NULL, &err);
NSString * tableName = @"Table_ichampion";
NSString * Name = @"name";
NSString * Age = @"age";
NSString * NameValue = @"abcd";
int AgeValue = 3;
NSString *sql3 = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES('%d', '%@', '%d')", tableName, @"id", Name, Age, 5, NameValue, AgeValue];
if (sqlite3_exec(db, [sql3 UTF8String], NULL, NULL, &err) != SQLITE_OK)
{
NSAssert(0, @"插入數據錯誤!");
}
}
同樣,我們可以看一下運行結果
接下來是數據修改,這裏選擇id爲5的記錄 name 更改爲 xyz
-(void)updateDB{
//id爲5的記錄 name 更改爲 xyz
NSString * sql = @"update Table_ichampion set name = 'xyz' where id = 5;";
char * err;
sqlite3_exec(db, sql.UTF8String, NULL, NULL, &err);
if (err) {
NSLog(@"修改失敗--%s",err);
}else{
NSLog(@"修改成功");
}
}
修改完成
然後是刪除,這裏刪除 abc 這條記錄
-(void)deleteDB{
// 刪除 name = abc 的記錄
NSString * sql = @"DELETE FROM Table_ichampion WHERE name = 'abc';";
char * err;
sqlite3_exec(db, sql.UTF8String, NULL, NULL, &err);
if (err) {
NSLog(@"刪除失敗--%s",err);
}else{
NSLog(@"刪除成功");
}
}
然後直接查看,看看是否刪除了abc這條記錄,以及數據庫中數據是否如截圖所示那樣(這裏查看分整張表格查看和單條記錄查看兩種)
-(void)selectDB{
NSString *sql = @"SELECT * FROM Table_ichampion";
sqlite3_stmt *statement;
// 查詢整張表格
if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
char *id = (char *)sqlite3_column_text(statement, 0);
NSString *idStr = [[NSString alloc] initWithUTF8String:id];
char *name = (char *)sqlite3_column_text(statement, 1);
NSString *nameStr = [[NSString alloc] initWithUTF8String:name];
char *age = (char *)sqlite3_column_text(statement, 2);
NSString *ageStr = [[NSString alloc] initWithUTF8String:age];
NSString *info = [[NSString alloc] initWithFormat:@"%@ - %@ - %@",
idStr, nameStr, ageStr];
NSLog(@"%@",info);
}
// 單條記錄查詢
NSString *sql1 = @"SELECT * FROM Table_ichampion WHERE name = 'Zhan';";
if (sqlite3_prepare_v2(db, [sql1 UTF8String], -1, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
char *id = (char *)sqlite3_column_text(statement, 0);
NSString *idStr = [[NSString alloc] initWithUTF8String:id];
char *name = (char *)sqlite3_column_text(statement, 1);
NSString *nameStr = [[NSString alloc] initWithUTF8String:name];
char *age = (char *)sqlite3_column_text(statement, 2);
NSString *ageStr = [[NSString alloc] initWithUTF8String:age];
NSString *info = [[NSString alloc] initWithFormat:@"%@ - %@ - %@",
idStr, nameStr, ageStr];
NSLog(@"%@",info);
}
}
sqlite3_finalize(statement);
/*
sqlite3_finalize
這個過程銷燬前面被sqlite3_prepare創建的準備語句,每個準備語句都必須使用這個函數去銷燬以防止內存泄露。
在空指針上調用這個函數沒有什麼影響,同時可以準備語句的生命週期的任一時刻調用這個函數:在語句被執行前,一次或多次調用sqlite_reset之後,或者在sqlite3_step任何調用之後不管語句是否完成執行
sqlite3_close
這個過程關閉前面使用sqlite3_open打開的數據庫連接,任何與這個連接相關的準備語句必須在調用這個關閉函數之前被釋放
*/
}
}
可以看到少了一條記錄,並且其他記錄保持不變
最後,對比一下SQLite Professional的截圖
最後是訪問數據庫的返回值,其中0代表沒有錯誤。我們可以用printf的方法來打印返回值,方便調試。
printf("CreateResult == %d\n",sqlite3_exec(db, sql.UTF8String, NULL, NULL, &err));
#define SQLITE_OK 0 /* Successful result */
/* beginning-of-error-codes */
#define SQLITE_ERROR 1 /* SQL error or missing database */
#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */
#define SQLITE_PERM 3 /* Access permission denied */
#define SQLITE_ABORT 4 /* Callback routine requested an abort */
#define SQLITE_BUSY 5 /* The database file is locked */
#define SQLITE_LOCKED 6 /* A table in the database is locked */
#define SQLITE_NOMEM 7 /* A malloc() failed */
#define SQLITE_READONLY 8 /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/
#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT 11 /* The database disk image is malformed */
#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */
#define SQLITE_FULL 13 /* Insertion failed because database is full */
#define SQLITE_CANTOPEN 14 /* Unable to open the database file */
#define SQLITE_PROTOCOL 15 /* Database lock protocol error */
#define SQLITE_EMPTY 16 /* Database is empty */
#define SQLITE_SCHEMA 17 /* The database schema changed */
#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */
#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */
#define SQLITE_MISMATCH 20 /* Data type mismatch */
#define SQLITE_MISUSE 21 /* Library used incorrectly */
#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */
#define SQLITE_AUTH 23 /* Authorization denied */
#define SQLITE_FORMAT 24 /* Auxiliary database format error */
#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */
#define SQLITE_NOTADB 26 /* File opened that is not a database file */
#define SQLITE_NOTICE 27 /* Notifications from sqlite3_log() */
#define SQLITE_WARNING 28 /* Warnings from sqlite3_log() */
#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */
#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */
/* end-of-error-codes */
工程源碼http://download.csdn.net/detail/u012138272/9588703
參考資料:http://www.cnblogs.com/hanjun/archive/2012/10/29/2744573.html