1

我在这段代码中遇到了一个问题:它在 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"

有任何想法吗?

问候!

编辑:

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

4

1 回答 1

2

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

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

PRAGMA integrity_check;

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

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

如果您决定尝试从数据库中恢复用户数据,您可以考虑按照Sergei Dorogin 的技术博客中概述的过程 - 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 的 Organizer,请转到“设备”部分,您可以将应用程序文件夹复制到您的 Mac,然后检查您 Mac 上的数据库,看看您是否确认该数据库与您预期的一样。

于 2013-04-11T15:50:48.880 回答