我必须弄清楚为什么我的应用程序崩溃了。问题是在我的设备(iPhone 5s(上它工作正常,但是我从iPhone 8 Plus收到了崩溃报告,这对我来说没有意义。
根据 Crashlytics 信息,当用户尝试调用数据库以检索某些数据的函数时,会发生错误。
- (NSArray*)getContent:(NSString*)ID{
NSMutableArray *retval = [[NSMutableArray alloc] init];
NSString *query = [NSString stringWithFormat:@"SELECT * from contents where ID = "%@"",ID];
const char* queryUTF8 = [query UTF8String];
sqlite3_stmt *statement;
@autoreleasepool {
int response = sqlite3_prepare_v2(_database, queryUTF8, -1, &statement, nil);
if (response == SQLITE_OK) {
Crashlytics报告错误位于以下行中:
if (response == SQLITE_OK) {
它还提到此方法是从另一个类调用的,特别是:
__43-[SessionManager calculateAllItemDistances]_block_invoke
SessionManager 是类,calculateAllItemDistances 是方法,这是对 getContent 方法的调用:
NSArray *contentData = [[self dataManager] getContent:"33"];
此代码位于其中:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
知道我该如何解决这个问题吗?
更新崩溃报告:https://pastebin.com/FsgC9fq8
我敢打赌这次崩溃与对SQLite的多线程访问有关。这种方式是你正在使用dispatch_get_global_queue,它映射到多个线程,并且在堆栈跟踪中线程#3
和线程#6
也在崩溃的同时执行与 DataBaseHandler/sqlite3_exec 相关的操作。
你不应该做多线程SQLite,除非你真的确定你需要这样做。
避免难以调试和理解的可怕事情的最简单解决方法是仅使用专用的单线程(也称为"串行"(队列来访问数据库,而不是使用dispatch_get_global_queue。请参阅创建串行派单队列
如果您确实需要多个线程,请阅读此内容并检查您的代码是否正确配置了它。