0

我正在尝试从 ios 应用程序中的 sqlite 数据库中读取数据。当我运行该应用程序时,它能够打开数据库,但在日志文件中它显示消息 - “准备语句存在问题”。我不知道我的准备语句有什么问题这是我的代码 -

-(NSString *)dataFilePath{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:kFilename];
}

viewDidLoad我有 -

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    myarray = [[NSMutableArray alloc]init];

    sqlite3 *database;
    if(sqlite3_open([[self dataFilePath]UTF8String], &database)!=SQLITE_OK){
        sqlite3_close(database);
       NSAssert(0, @"Failed to open database");
    }

    const char *createSQL = @"SELECT ID, TITLE FROM FIRST ORDER BY TITLE;"; //first is the table in the database
    sqlite3_stmt *sqlStmt;
    if(sqlite3_prepare_v2(database, [createSQL UTF8String], -1, &sqlStmt, nil)!=SQLITE_OK){
        NSLog(@"Problem with prepare statement"); //this is where the code gets stuck and I don't know why
    }else{

        while(sqlite3_step(sqlStmt)==SQLITE_ROW){
            NSInteger number = sqlite3_column_int(sqlStmt, 0);
            NSString *title = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStmt, 1)];
            [myarray addObject:title];
        }
        sqlite3_finalize(sqlStmt);
    }
    sqlite3_close(database);
}
4

3 回答 3

1

您可以尝试几件事。

  1. 清理您的应用程序,从模拟器或设备中删除并尝试再次安装新副本,看看它是否有效。

  2. 在终端中打开您的数据库并尝试在那里运行您的 sql 语句。检查您是否获得了所需的输出。

于 2012-06-28T12:08:35.620 回答
1

如果您的准备语句失败,而不仅仅是报告“准备语句问题”,请尝试检索错误消息,例如,

NSLog(@"%s Prepare failure '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database));

这可能会让您更好地指示问题。

我过去看到的一个问题是可能找不到数据库(因为它没有包含在包中,名称中的拼写错误等)但是sqlite3_open如果它不存在,标准函数将创建它,因此将sqlite3_open成功,但在新创建的空白数据库中找不到相关表。比sqlite3_open会更好:

sqlite3 *database;
if (sqlite3_open_v2([[self dataFilePath] UTF8String], &database, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) {
    sqlite3_close(database); // not sure you need to close if the open failed
    NSAssert(0, @"Failed to open database");
}

这样,如果找不到数据库,您会收到警告。但是如果你已经完成sqlite3_open了,你可能有一个空白数据库,所以你可能想要重置你的模拟器和/或从你的设备中删除应用程序,然后再尝试使用sqlite3_open_v2.

于 2012-06-28T15:11:16.453 回答
0

尝试将 nil 更改为 NULL。此外,尝试将 SQL 语句定义为 const char。

....

const char *sql = "SELECT ID, TITLE FROM FIRST ORDER BY TITLE";
sqlite3_stmt *sqlStmt;

if(sqlite3_prepare_v2(database, sql, -1, &sqlStmt, NULL)!=SQLITE_OK){

....
于 2012-06-28T10:41:08.177 回答