应用程序在第一次运行时崩溃加载数据库

Posted

技术标签:

【中文标题】应用程序在第一次运行时崩溃加载数据库【英文标题】:App crashes loading database at the first run 【发布时间】:2019-03-26 05:39:36 【问题描述】:

在我的应用程序中,我使用服务从 JSON 获取数据,然后将其保存在数据库中。

当我在新设备上运行应用程序时,它会崩溃没有任何错误

但是当我注释掉用于加载到 TextViews 的代码时,它运行良好。之后,即使我将代码带回给 TextViews,它也能正常工作。

更新: 在我注释掉用于提供 TextViews 的代码之前,用于提供数据库的服务不会运行。

提供 TextViews 的代码:

//this service contains JSON to DB code
Intent intent = new Intent(MainActivity.this, GetdataService.class);
startService(intent);

cursor = DBOps.Ops.getTheOne();
cursor.moveToNext();

//app crashes at this line    
wordText.setText(cursor.getString(cursor.getColumnIndex(DBContracts.Word.TITLE)));
phonetic = cursor.getString(cursor.getColumnIndex(DBContracts.Word.PHONETIC));
meaningText.setText(cursor.getString(cursor.getColumnIndex(DBContracts.Word.MEANING)));
exampleText.setText(cursor.getString(cursor.getColumnIndex(DBContracts.Word.EXAMPLE)));

获取物品的方法:

public static Cursor getTheOne()
    return db.query(DBContracts.Word.TABLE_NAME,
            null,
            null,
            null,
            null,
            null,
            DBContracts.Word._ID + " DESC LIMIT 1"
    );

【问题讨论】:

请提供崩溃日志 - 并且需要在日志中的某处提到错误 @WarrenFaith 这就是重点。没有错误!! android Monitor 没有任何反应! logcat 中没有没有痕迹的崩溃...我认为您的 .光标为空 @Bruno 没有输入光标,我已经检查过了。 您确定您的数据库包含DBContracts.Word.TITLE 列吗?很抱歉,如果没有日志跟踪,将很难为您提供帮助 【参考方案1】:

请考虑在遇到崩溃时检查堆栈跟踪。

但根据您的描述:第一次运行时崩溃,以后运行时有效 - 这表明第一次运行时没有数据,但在以后运行时查询返回一些数据。

cursor.moveToNext() 返回一个布尔值,如果移动成功,即有一些数据,则该值为真。您应该始终检查光标moveTo...() 返回值。崩溃本身是因为 Cursor#getString() 在无效行上。

【讨论】:

是的,我发现我的数据库是空的。问题是,提供数据库的服务在我注释掉用于提供 TextViews 的代码之前不会运行!并且触发服务的代码在提供TextViews的代码之上。 服务在后台线程中运行,因此在 TextView 中显示数据后可以运行向 DB 馈送的任务。您应该检查服务任务是否完成。 @sso.techie 我将我的 JSON 代码带入我的 MainActivity 并将其放入一个方法中。但是,在我注释掉数据库内容之前,此方法不会运行!我很沮丧。

以上是关于应用程序在第一次运行时崩溃加载数据库的主要内容,如果未能解决你的问题,请参考以下文章

加载谷歌地图时应用程序崩溃没有任何错误

频繁重新加载collectionView时崩溃

Xcode 11 beta 模拟器在尝试加载 AudioToolbox 时崩溃

为啥我的 iPhone 应用程序的发布版本在安装后第一次运行时会在设备上崩溃?

ipad:图像加载和内存管理问题以及应用程序崩溃

Xcode 4.6.2 应用程序在每秒运行一次时崩溃