sqlite3_prepare_v2在iPhone和iPad mini设备上返回OK,但在普通iPad设备上出错

时间:2013-04-11 15:40:41

标签: ios sqlite

我在这段代码中遇到了一个问题:它在iPhone和iPad Mini上运行正常,但它在大iPad上发出了错误信息。有什么理由吗?

代码:

- (sqlite3_stmt *)executeQuery:(char *)aQuery {
    NSString *dbPath = [[NSUserDefaults standardUserDefaults] objectForKey:kDBPath];
    sqlite3_stmt *statement = NULL;
    sqlite3 *database;
    if (sqlite3_open((char *)[dbPath UTF8String], &database) == SQLITE_OK) {
        if (sqlite3_prepare_v2(database, aQuery, -1, &statement, NULL) != SQLITE_OK) {
            //Here is the point: on iPad Mini and iPhone it works fine, but on the normal iPad it can't execute this query
            NSLog(@"Error on SQL - (sqlite3_stmt *)executeWithReturn:(char *)aQuery");
            statement = NULL;
        }
    } else {
        NSLog(@"Error on Open database");
    }
    return statement;
}

LLDB的印刷品:

(lldb) print (BOOL)[[NSFileManager defaultManager] isWritableFileAtPath:dbPath]
(BOOL) $0 = YES
(lldb) print (char *)aQuery
(char *) $1 = 0x1f0a1000 "select CodAplicacao, CodLocalidade, Nome, Desc, DataCriacao, Editando from Aplicacao_en"

有什么想法吗?

问候!

修改

收到错误“数据库磁盘映像格式错误”。我在互联网上找不到如何解决它。

1 个答案:

答案 0 :(得分:2)

在修订后的问题中,您通知我们sqlite3_errmsg报告“数据库磁盘映像格式错误”。这表明您的数据库已损坏。如果您的应用程序在之前某个日期执行某些数据库操作时崩溃,则会发生这种情况。

您可以通过运行以下SQL来确认:

PRAGMA integrity_check;

如果您想要完成该过程,可以将数据库从您的设备复制回Mac(使用Xcode的管理器并转到“设备”部分),然后使用您选择的Mac SQLite数据库工具(最坏情况) ,命令行sqlite3程序)然后运行上一个PRAGMA命令。您甚至可以以编程方式执行此操作(它返回类似SELECT语句的结果集。)

事实是,我们相信它会报告问题。简单的解决方法是重建数据库(例如删除数据库,如果您最初从数据库中复制它,再次执行此操作,如果以编程方式创建它,请重复该过程)。

如果您决定尝试从数据库中恢复用户数据,则可以考虑遵循Sergei Dorogin's technical blog - SQLiteException "database disk image is malformed"中列出的流程。他写了一个不同的平台,但基本过程可能适用于此。事情是,除非你绝对需要恢复用户数据,否则这个过程可能是不必要的。

因此,简而言之,该设备上的数据库已损坏,您需要重建它。只需删除应用程序(如果您的数据库位于Documents文件夹中,您需要删除应用程序以清空该文件夹)并重新安装该应用程序,您应该很好。


从以下日期更改日志声明:

NSLog(@"Error on SQL - (sqlite3_stmt *)executeWithReturn:(char *)aQuery");

NSLog(@"Error on SQL - %s: %s", __FUNCTION__, sqlite3_errmsg(database));

这应该会给你一个信息性的错误信息,告诉你什么是错的。

通常,这类问题是由该特定设备上的数据库版本引起的。它极不可能与设备本身相关。

也许您的应用在某个时刻创建了一个空白数据库,因此找不到该表。如果您使用Xcode的管理器,请转到“设备”部分,然后您可以将应用程序文件夹复制到Mac,然后检查Mac上的数据库,看看您是否确认数据库符合您的预期。