Ios sqlite3\u步骤始终返回SQLITE\u DONE
我试图从单表sqlite数据库检索数据,但是(sqlite3_步骤(语句)==sqlite_行)总是返回false。我已经手动检查了数据库中的值,它们已经存在。以下是完整的代码:Ios sqlite3\u步骤始终返回SQLITE\u DONE,ios,xcode,sqlite,Ios,Xcode,Sqlite,我试图从单表sqlite数据库检索数据,但是(sqlite3_步骤(语句)==sqlite_行)总是返回false。我已经手动检查了数据库中的值,它们已经存在。以下是完整的代码: -(NSArray *)findByPartNumber:(NSString *)partNumber { const char *dbpath = [databasePath UTF8String]; NSMutableArray *resultArray = [[NSMutableArray all
-(NSArray *)findByPartNumber:(NSString *)partNumber
{
const char *dbpath = [databasePath UTF8String];
NSMutableArray *resultArray = [[NSMutableArray alloc] init];
if(sqlite3_open(dbpath, &database) == SQLITE_OK)
{
NSString *querySQL = [NSString stringWithFormat:@"SELECT Description, ListPrice FROM PriceList WHERE PartNumber=?"];
const char *query_stmt = [querySQL UTF8String];
if(sqlite3_prepare_v2(database, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
sqlite3_bind_text(statement, 1, [partNumber UTF8String], -1, SQLITE_STATIC);
if(sqlite3_step(statement) == SQLITE_ROW)
{
NSString *description;
NSString *listPrice;
const char *tmp1 = (const char *)sqlite3_column_text(statement, 0);
const char *tmp2 = (const char *)sqlite3_column_text(statement, 1);
if(tmp1 == NULL)
description = nil;
else
{
description = [[NSString alloc] initWithUTF8String:tmp1];
[resultArray addObject:description];
}
if(tmp2 == NULL)
listPrice = nil;
else
{
listPrice = [[NSString alloc] initWithUTF8String:tmp2];
[resultArray addObject:listPrice];
}
sqlite3_finalize(statement);
}
}
sqlite3_close(database);
}
if([resultArray count] == 0)
return nil;
else
return resultArray;
}
代码进入sqlite3\u prepare\u v2块,但跳过sqlite3\u步骤块。我遗漏了什么吗?您的实现存在问题 你写得像:
sqlite3_bind_text(statement, 1, [partNumber UTF8String], -1, SQLITE_STATIC);
if(sqlite3_prepare_v2(database, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
...
}
您只能将值绑定到准备好的语句,因此将上述代码更改为:
if(sqlite3_prepare_v2(database, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
sqlite3_bind_text(statement, 1, [partNumber UTF8String], -1, SQLITE_STATIC);
...
}
结果是sqlite3_步骤总是返回SQLITE_DONE,因为没有数据。我的数据库路径设置不正确 错误代码:
NSString *docsDir;
NSArray *dirPaths;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = dirPaths[0];
databasePath = [[NSString alloc] initWithString:[docsDir stringByAppendingPathComponent: @"databaseName.sqlite"]];
databasePath = [[NSBundle mainBundle] pathForResource:@"databaseName" ofType:@"sqlite"];
正确代码:
NSString *docsDir;
NSArray *dirPaths;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = dirPaths[0];
databasePath = [[NSString alloc] initWithString:[docsDir stringByAppendingPathComponent: @"databaseName.sqlite"]];
databasePath = [[NSBundle mainBundle] pathForResource:@"databaseName" ofType:@"sqlite"];
谢谢你的回复,我已经像你说的那样移动了这条线,我仍然得到同样的结果。还有什么我遗漏的吗?@mbeem:你确定这个查询是正确的吗。不管它是否工作,只要手动执行它。还有其他想法吗?环顾四周,我看到了类似的问题,代码是正确的,但数据库需要重建。我不相信这会解决我的问题,因为我可以手动查询它,再加上有1500行,所以我不想再做一遍…@mbeem我认为bind_text会导致问题。取而代之的是,暂时编写一个硬编码查询,并检查它是否工作(不需要bind_文本),如果它工作,问题是bind_文本call@mbeem您能否共享一个示例数据库,该示例数据库具有与您的数据库相同的结构,其中包含一些虚拟值?