应用程序在第一次运行时崩溃加载数据库
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 并将其放入一个方法中。但是,在我注释掉数据库内容之前,此方法不会运行!我很沮丧。以上是关于应用程序在第一次运行时崩溃加载数据库的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 11 beta 模拟器在尝试加载 AudioToolbox 时崩溃