iPhone開發中資料庫使用是本文要介紹的內容,iPhone使用的是sqlite資料庫,我用了firefox的外掛程式Sqlite Manager來管理sqlite,這個外掛程式很好用,可以很方便的進行視圖化的建立以及管理sqlite。廢話不多說,進入正題。
要使用sqlite首先要在Frameworks中引入libsqlite3.0.dylib這個檔案,具體步驟我就略過了,然後建立資料庫,建好後將資料庫添加到Resources目錄下(記得勾選Copy items into ...這個選項),現在準備工作都已經做好,下面進入代碼編寫。
為了方便使用,以及以後的維護,我在這裡建立了一個類將資料庫的相關代碼進行了封裝。建立一個NSObject類,我在這裡取名為GADatabase,然後在實現檔案中添加以下代碼:
- #import <sqlite3.h>
-
- id getColValue(sqlite3_stmt *stmt,int iCol) {
- int type = sqlite3_column_type(stmt, iCol);
- switch (type) {
- case SQLITE_INTEGER:
- return [NSNumber numberWithInt:sqlite3_column_int(stmt, iCol)];
- break;
- case SQLITE_FLOAT:
- return [NSNumber numberWithDouble:sqlite3_column_double(stmt, iCol)];
- break;
- case SQLITE_TEXT:
- return [NSString stringWithUTF8String:sqlite3_column_text(stmt, iCol)];
- break;
- case SQLITE_BLOB:
- return [NSData dataWithBytes:sqlite3_column_blob(stmt, iCol) length:sqlite3_column_bytes(stmt, iCol)];
- break;
- case SQLITE_NULL:
- return @"";
- break;
- default:
- return @"NONE";
- break;
- }
- }
在這裡,我使用了C風格的定義,並且定義在了@implementation之外以方便使用,有了這個函數在以後的資料提取時很方便,其中的資料類型可根據實際情況進行增減。OK,現在在@implementation與@end之間添加下面的代碼以擷取iphone中sqlite的地址:
- + (NSString *)pathForDatabase {
- NSArray *arrayOfPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString *path = [arrayOfPaths objectAtIndex:0];
- path = [path stringByAppendingPathComponent:@"yourDatabaseName.sqlite"];
- NSLog(path);
- NSFileManager *fileManager = [NSFileManager defaultManager];
- if(![fileManager fileExistsAtPath:path]){
- NSString *databaseSource = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"yourDatabaseName.sqlite"];
- if(![fileManager copyItemAtPath:databaseSource toPath:path error:nil]){
- return nil;
- }
- }
- return path;
- }
好了,現在可以寫sql語句了,我簡單舉幾個例子:
查詢某一個欄位:
- - (NSString *)select:(NSString *)Parameter {
- sqlite3 *database;
- sqlite3_stmt *stm;
- NSString *result = [NSString string];
- NSString *sql = [NSString stringWithFormat:@"SELECT columnName FROM table WHERE columnName='%@'", Parameter];
-
- if(sqlite3_open([[GADatabase pathForDatabase] UTF8String], &database) == SQLITE_OK) {
- if(sqlite3_prepare_v2(database, [sql UTF8String], -1, &stm, NULL) == SQLITE_OK) {
- if(sqlite3_step(stm) == SQLITE_ROW) {
- result = getColValue(stm, 0);
- }
- }
- sqlite3_finalize(stm);
- }
- sqlite3_close(database);
- return result;
- }
若查詢多欄位,可以用一個數組並結合一個自訂類來儲存,例:
- - (NSMutableArray *)selectUsers {
- sqlite3 *database;
- sqlite3_stmt *stm;
- NSMutableArray *result = [[NSMutableArray alloc] init];
- NSString *sql = @"SELECT * FROM users";
-
- if(sqlite3_open([[GADatabase pathForDatabase] UTF8String], &database) == SQLITE_OK) {
- if(sqlite3_prepare_v2(database, [sql UTF8String], -1, &stm, NULL) == SQLITE_OK) {
- while(sqlite3_step(stm) == SQLITE_ROW) {
- GAData *userObj = [[GAData alloc] init];
- userObj.rId = getColValue(stm, 0);
- userObj.userName = getColValue(stm, 1);
- userObj.passWord = getColValue(stm, 2);
- [result addObject:userObj];
- [userObj release];
- }
- }
- sqlite3_finalize(stm);
- }
- sqlite3_close(database);
- return result;
- }
GAData的類定義如下:
- #import <Foundation/Foundation.h>
- @interface GAData : NSObject {
- NSNumber *rId;
- NSString *userName;
- NSString *passWord;
- }
- @property(nonatomic, retain)NSNumber *rId;
- @property(nonatomic, retain)NSString *userName;
- @property(nonatomic, retain)NSString *passWord;
- @end
- #import "GAData.h"
- @implementation GAData
- @synthesize rId;
- @synthesize userName;
- @synthesize passWord;
- @end
向資料庫添加資料:
- - (void)addUser:(GAData *)addUserObj {
- sqlite3 *database;
- NSString *sql = [NSString stringWithFormat:@"INSERT INTO users (userName, passWord) VALUES('%@','%@')",
- addUserObj.userName, addUserObj.passWord];
-
- int status = sqlite3_open([[GADatabase pathForDatabase] UTF8String], &database);
- if(status != SQLITE_OK) {
- return;
- }
- status = sqlite3_exec(database, [sql UTF8String], 0, 0, NULL);
- if(status != SQLITE_OK) {
- return;
- }
- sqlite3_close(database);
- }
刪除,修改與添加類似,無非是sql語句的不同,就不再舉例了,下面我再說下sqlite中的時間函數,由於目前為止我還只用到了關於計算天數的函數,所以其他的我就不介紹了,大家可以在網上搜尋一下,看下面這條sql語句:
- SELECT columnName FROM table WHERE (julianday(date(columnName))-julianday(date('now')))>10
julianday()這個函數會返回一個天數,從格林威治時間公元前4714年11月24號開始算起。date()函數返回一個以“YYYY-MM-DD”為格式的日期。因此上面那條語句也就不難理解了。
關於資料庫方面的我就暫時寫這麼多了,有不夠好的地方或者錯誤的地方歡迎大家指出來,大家一起學習嘛。最後,我再提醒一句,如果修改了Resources目錄下的資料庫內容,需要將原先編譯好的程式刪除掉,重新編譯,或者找到程式運行時的路徑,刪掉Documents檔案夾下的資料庫檔案,再重新編譯運行,只有這樣,你程式中的資料庫才會更新,切記!
小結:iPhone開發中資料庫使用教程的內容介紹完了,希望本文對你有所協助!