无法从sqlite3数据库中选择

时间:2012-04-09 11:41:19

标签: objective-c ios sqlite

从sqlite3数据库读取时遇到一些问题。

-(void) readMessengesFromDatabase {
    sqlite3 *database;

    messenges = [[NSMutableArray alloc] init];

    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        NSLog(@"Connection OK");
        const char *sqlStatement = "select * from MessagesData";
        sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) NSLog(@"connect to table OK");    else NSLog(@"connect to table FALSE");
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { //не проходит условие
            NSLog(@"Connection to table OK");
            while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                NSLog(@"Read rows OK");
                NSString *dbMessageID = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
                NSString *dbMessageText = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                NSString *dbMessageDate = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
                NSString *dbMediaOrNot = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];

                Message *messege = [[Message alloc] initWithName:dbMessageText messageID:dbMessageID messageDate:dbMessageDate mediaOrNot:dbMediaOrNot];

                [messenges addObject:messege];

                [messege release];
            }
        }
        sqlite3_finalize(compiledStatement);
    }
    sqlite3_close(database);    
}

我的第一个NSLog告诉我与数据库的连接是否正常。但是下一步“从MessagesData中选择*”和if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) NSLog(@"connect to table OK"); else NSLog(@"connect to table FALSE");向我显示“连接到表FALSE”。尝试从我的数据库表中选择终端并出现错误“无法打开数据库文件”。我的错误在哪里?我的代码中没有发现任何问题...

3 个答案:

答案 0 :(得分:2)

如果您打印sqlite3_prepare_v2返回的错误代码,诊断问题会容易得多。数值可以在this page上找到。

int errorCode = sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL);
if(errorCode != SQLITE_OK) {
    NSLog(@"Connect to table failed: %d", errorCode); 
}

但是,如果您甚至无法从sqlite3命令行工具中的数据库中进行选择,我建议您检查该文件是否存在,是否可读并且格式正确。

尝试在模拟器中重现错误(如果失败,请将数据库文件复制到计算机,例如使用管理器)。尝试使用sqlite3运行查询(我知道你确实试过了,但请确保检查以下内容)。

如果您收到消息Error: file is encrypted or is not a database,则表示数据库文件已损坏。如果您获得Error: no such table:,则表示您的数据库不存在,为空,或者只是没有获得该表。如果你得到(如你的问题):Error: unable to open database(你在打开sqlite时得到这个,而不是在执行查询时),这意味着sqlite无法读取文件(例如权限)。

答案 1 :(得分:1)

我猜你的数据库无法连接。 从Here ...

尝试我的答案

我在这里提到了一些事情,我相信你会很好

让我知道它有效

答案 2 :(得分:0)

编写代码以检查表是否存在。在你执行查询之前,选择你应该检查创建表,如果不存在....

NSLog(@“连接正常”);

 sqlite3_exec(database,"CREATE TABLE IF NOT EXISTS MessagesData (ID INTEGER PRIMARY KEY AUTOINCREMENT ,"
                             "FirstName TEXT,LastName TEXT"));

   const char *sqlStatement = "select * from MessagesData";

如果有效,请喜欢