【问题标题】:iPhone SQLite Database Reading And WritingiPhone SQLite 数据库读写
【发布时间】:2011-03-26 02:47:17
【问题描述】:

所以我正在尝试在其中一个 iPhone 应用程序中使用 SQLite,并且我正在使用 sqlite3 库。我可以访问数据库,甚至可以进行查询;事实上,查询访问了确切的数据,但由于某种原因,我得到的字符串是一个长整数,而不是我正在寻找的字符串。这是数据库和代码:

文件名:Package.sql 表课 LessonID VARCHAR(64) 主键 |课程名称 VARCHAR(100) |输入日期(日期时间)|计时 VARCHAR (20) bfow02nso9xjdo40wksbfkekakoe29ak |学习历史 | 2010-08-05 16:24:35 | 0001

还有 iPhone 代码

... -(NSString *)getRow:(NSString *)tablename 其中:(NSString *)column equals:(NSString *)value { const char *query = [[[[[[[@"SELECT * FROM `" stringByAppendingString:tablename] stringByAppendingString:@"` WHERE `"] stringByAppendingString:column] stringByAppendingString:@"` = '"] stringByAppendingString:value] stringByAppendingString :@"';"] cStringUsingEncoding:NSUTF8StringEncoding]; NSString *结果; if(sqlite3_open([dbpath UTF8String], &database) == SQLITE_OK) { sqlite3_stmt *compiledQuery; if(sqlite3_prepare_v2(database, query, -1, &compiledQuery, NULL) == SQLITE_OK) { 而(sqlite3_step(compiledQuery)== SQLITE_ROW){ NSString *str_temp = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledQuery, 2)]; 结果 = str_temp; } sqlite3_finalize(compiledQuery); } sqlite3_close(数据库); } 返回结果; } ...

代码执行时:

CDatabase *db = [[CDatabase alloc]initWithDatabase:@"Package.sql"]; NSString *result = [db getRow:@"Lessons" 其中:@"Chrono" 等于:@"0001"];

返回值 NSString *result 的值为“1,364,111”。为什么要这么做???应该是“学习历史”

【问题讨论】:

  • 你应该试试 Gus Mueller 的 FMDatabase。我在我的项目中使用它,它做得很好。 (如果要在整个应用程序中使用 FMDatabase 对象,请记住保留它。)

标签: iphone objective-c database xcode sqlite


【解决方案1】:

您确定您的任何 SQLite 调用都成功了吗?您应该将result 初始化为nil,这样如果发现任何错误,您的函数就会返回nil

您的代码存在三个(可能相关)问题:

  1. sqlite3_column_text 的索引应该从零开始;你正在传递2,它应该是指第三列。您可能的意思是通过1。来自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。

【讨论】:

  • 感谢您的快速回复!我实际上找到了另一种编写代码的方法,但我肯定会尝试你的。这与我使用的字符串编码类型有关。
【解决方案2】:

哈哈,我意识到我只是使用%d 字符串格式将字符串显示为数据格式。当我将其更改为%@ 时,我得到了字符串格式

【讨论】:

    猜你喜欢
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多