2010-08-06 172 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