我在这段代码中遇到了一个问题:它在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"
有什么想法吗?
问候!
修改
收到错误“数据库磁盘映像格式错误”。我在互联网上找不到如何解决它。
答案 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上的数据库,看看您是否确认数据库符合您的预期。