iPhone SQLite数据库读写
所以我想在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” 的值。为什么这样做?它应该是“学习历史”
哈哈哎呀,我意识到我只是通过使用%d
字符串格式显示字符串作为数据格式。当我将其更改为%@
我得到了字符串格式
你确定你的SQLite调用是否成功?您应该初始化result
至nil
,以便在发现任何错误时您的函数返回nil
。
三(可能有关)与您的代码的问题:
-
的指数
sqlite3_column_text
应该是零基础;你通过2
,应该参考第三栏。你可能是想通过1
。 From the docs:...第二个参数是应该返回信息的列索引。结果集的最左边一列的索引为0.
您确实不应该使用
SELECT *
。指定你想要的列!您应该通过绑定值来专门化查询,而不是串联字符串!你的代码充斥着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.
感谢您的快速回复!我实际上找到了一种替代方法来编写代码,但我很想去尝试你的代码。它与我使用的字符串编码类型有关。 – 2010-08-06 17:31:51
您应该尝试Gus Mueller的FMDatabase。我在我的项目中使用它,它很好地完成了这项工作。 (如果你打算在整个应用程序中使用它,请记住保留FMDatabase对象。) – 2010-08-26 01:31:23