2010-08-06 4 views
1

所以我想在SQL應用程序中使用SQLite,我正在使用sqlite3庫。我能夠訪問數據庫,甚至可以查詢;實際上查詢訪問確切的數據,但由於某種原因,我回來的字符串是一個長整數,而不是我正在尋找的字符串。下面是數據庫,代碼:iPhone SQLite數據庫讀寫

 
Filename: Package.sql 
Table Lessons 
LessonID VARCHAR(64) Primary Key | LessonName VARCHAR(100) | EntryDate (DATETIME) | Chrono VARCHAR (20) 
bfow02nso9xjdo40wksbfkekakoe29ak | Learning The History | 2010-08-05 16:24:35 | 0001 

和iPhone代碼

 
... 
-(NSString *)getRow:(NSString *)tablename where:(NSString *)column equals:(NSString *)value { 

  const char *query = [[[[[[[@"SELECT * FROM `" stringByAppendingString:tablename] stringByAppendingString:@"` WHERE `"] stringByAppendingString:column] stringByAppendingString:@"` = '"] stringByAppendingString:value] stringByAppendingString:@"';"] cStringUsingEncoding:NSUTF8StringEncoding]; 

  NSString *result; 

  if(sqlite3_open([dbpath UTF8String], &database) == SQLITE_OK) { 

    sqlite3_stmt *compiledQuery; 

    if(sqlite3_prepare_v2(database, query, -1, &compiledQuery, NULL) == SQLITE_OK) { 

      while(sqlite3_step(compiledQuery) == SQLITE_ROW) { 

        NSString *str_temp = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledQuery, 2)]; 

        result = str_temp; 
         
      } 

      sqlite3_finalize(compiledQuery); 

    } 

    sqlite3_close(database); 

  } 
  
  return result; 

} 
... 

當代碼執行:

 
    CDatabase *db = [[CDatabase alloc]initWithDatabase:@"Package.sql"]; 
    NSString *result = [db getRow:@"Lessons" where:@"Chrono" equals:@"0001"]; 

返回值的NSString *結果爲 「1364111」 的值。爲什麼這樣做?它應該是「學習歷史」

+0

您應該嘗試Gus Mueller的FMDatabase。我在我的項目中使用它,它很好地完成了這項工作。 (如果你打算在整個應用程序中使用它,請記住保留FMDatabase對象。) – 2010-08-26 01:31:23

回答

0

哈哈哎呀,我意識到我只是通過使用%d字符串格式顯示字符串作爲數據格式。當我將其更改爲%@我得到了字符串格式

2

你確定你的SQLite調用是否成功?您應該初始化resultnil,以便在發現任何錯誤時您的函數返回nil

三(可能有關)與您的代碼的問題:

  1. 的指數sqlite3_column_text應該是零基礎;你通過2,應該參考第三欄。你可能是想通過1。 From the docs

    ...第二個參數是應該返回信息的列索引。結果集的最左邊一列的索引爲0.

  2. 您確實不應該使用SELECT *。指定你想要的列!

  3. 您應該通過綁定值來專門化查詢,而不是串聯字符串!你的代碼充斥着SQL注入的可能性(更不用說不正確的查詢)。

例如(沒有錯誤檢查):

const char *query = "SELECT * FROM ? WHERE ?=?"; 
sqlite3_stmt *compiledQuery; 
sqlite3_prepare_v2(database, query, -1, &compiledQuery, NULL); 
sqlite3_bind_text(compiledQuery, 1, "Lessons", -1, SQLITE_TRANSIENT); 
sqlite3_bind_text(compiledQuery, 2, "Chrono", -1, SQLITE_TRANSIENT); 
sqlite3_bind_text(compiledQuery, 3, "0001", -1, SQLITE_TRANSIENT); 

注意,這裏的指數是以1(我不知道他們爲什麼這樣做)。來自docs

第二個參數是要設置的SQL參數的索引。最左邊的SQL參數索引爲1.

+0

感謝您的快速回復!我實際上找到了一種替代方法來編寫代碼,但我很想去嘗試你的代碼。它與我使用的字符串編碼類型有關。 – 2010-08-06 17:31:51