2012-06-26 76 views
1

這一定是一個愚蠢的問題,但我不能讓我的查詢工作。它就好像我的數據庫是空的(我重複檢查,不是)。它是一個簡單的SELECT * FROM table查詢。這是我嘗試:xCode sqlite查詢

+(MyDatabase *)database{ 
    if (database == nil) { 
     database = [[MyDatabase alloc] init]; 
    } 
    return database; 
} 
- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     NSString *sqliteDb = [[NSBundle mainBundle] pathForResource:@"personsDB" ofType:@"sqlite3"]; 
     if (sqlite3_open([sqliteDb UTF8String], &database) != SQLITE_OK) { 
      NSLog(@"Fail to open Database."); 
     } 
    } 
    return self; 
} 

-(NSArray *)getAllRows{ 
    NSMutableArray *retArray = [[NSMutableArray alloc] init]; 
    NSString *query = @"SELECT * FROM persons"; 

    sqlite3_stmt *statement; 
    NSLog(@"checking SQLITE_OK?"); 
    if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) { 
     NSLog(@"SQLITE_OK"); 
     while (sqlite3_step(statement) == SQLITE_ROW) { 
      int personID = sqlite3_column_int(statement, 0); 
      char *personChars = (char *) sqlite3_column_text(statement, 1); 
      int gender = sqlite3_column_int(statement, 2); 
      int related = sqlite3_column_int(statement, 3); 

      NSString *person = [[NSString alloc] initWithUTF8String:personChars]; 
      MyDBInfo *info = [[MyDBInfo alloc] initWithpersonID:personID person:person gender:gender related:related ]; 

      [retArray addObject:info]; 
     } 
     sqlite3_finalize(statement); 
    } 
    return retArray; 
} 

我想這是所有有趣的東西。

在我的日誌中我得到checking SQLITE_OK?,但沒有SQLITE_OK。我沒有得到Fail to open Database.,所以我認爲它的一切都很好。

我的數據庫已滿,有一張名爲persons的表格。我很新sqliteiOS apps

謝謝。

+0

名爲人士表? – bgoers

+0

是的,位於'personsDB'中。 –

+1

你確定數據庫包含在你的包中嗎?我有時會將文件添加到我的xcode項目中,而不會自動包含它們。選擇項目導航器頂部的目標,單擊目標,在主面板中選擇目標,選擇「Build Phases」,並查看您的數據庫是否包含在「Copy Bundle Resources」中。 – Rob

回答

3
  1. 你確定數據庫是包含在你的包? sqlite3_open的默認行爲是SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,因此如果它尚未存在,它將在您的設備/模擬器上創建,因此您不會看到Fail to open Database。如果您不想要SQLITE_OPEN_CREATE,請使用sqlite3_open_v2。無論如何,我有時會將文件添加到我的xcode項目中,並且它們不會自動包含在我的包中。選擇項目導航器頂部的目標,單擊目標,在主面板中選擇目標,選擇「Build Phases」,並查看您的數據庫是否包含在「Copy Bundle Resources」中。

  2. 可能是不相關的,但我總是將數據庫從數據庫複製到文檔文件夾(如果它不存在)。

  3. 如果我沒有收到預期的SQLITE_OK,我總是看看我的返回碼或記錄我的錯誤消息和錯誤代碼(這可能會報告沒有找到問題表,這會讓你確定問題)。

因此,

NSLog(@"%s db err '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(contactDB), sqlite3_errcode(contactDB)); 
+0

謝謝,我瘋了:P –