gpt4 book ai didi

iPhone SQLite数据库读写

转载 作者:搜寻专家 更新时间:2023-10-30 23:23:11 24 4
gpt4 key购买 nike

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

Filename: Package.sqlTable LessonsLessonID 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 *result 的值为“1,364,111”。为什么要这样做???应该是“学习历史”

最佳答案

您确定您的任何 SQLite 调用都成功了吗?您应该将 result 初始化为 nil,以便您的函数在捕获到任何错误时返回 nil

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

  1. sqlite3_column_text 的索引应该从零开始;您传递的是 2,它应该引用第三列。您可能想传递 1。来自 the docs :

    ...the second argument is the index of the column for which information should be returned. The leftmost column of the result set has the index 0.

  2. 你真的不应该使用 SELECT *。指定您想要的列!

  3. 您应该通过绑定(bind)值来专门化您的查询,而不是通过连接字符串!您的代码充满了 SQL 注入(inject)的可能性(更不用说不正确的查询了)。

例如(没有错误检查):

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 :

The second argument is the index of the SQL parameter to be set. The leftmost SQL parameter has an index of 1.

关于iPhone SQLite数据库读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3420241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com