数据库更新仅在运行时崩溃,而在调试模式下不会崩溃

时间:2020-04-21 20:58:14

标签: android database debugging android-sqlite

我正在一个通过AsyncTask更新数据库的项目中,当我在Debug模式下运行它时,一切正常,但是当我在运行模式下使用AVD运行它时,它崩溃并给出以下消息:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.database.sqlite.SQLiteDatabase.execSQL(java.lang.String)' on a null object reference

正如我之前提到的,只有在使用AVD的运行模式下才会崩溃!

谁能解释我发生了什么事?

在Karan Dhillon的建议之后:

我已经尝试过使用Executors(使用FixedThreadPool)和HandlerThread两种方式,因为我需要在数据库中插入几行新记录,甚至通过ContentValues和SQL Query更改了插入这些数据的方法。串。一直以来,在通过AVD处于“运行”模式时,我仍然收到以下错误消息:当我尝试使用SQL查询插入时:

E / AndroidRuntime:致命例外:辅助进程:com.jagetram.senarand,PID:6006 android.database.sqlite.SQLiteConstraintException:NOT NULL约束失败:android.database.sqlite.SQLiteConnection上的TABLE_NAME.FIRST_FIELD(代码1299) .nativeExecuteForChangedRowCount(本机方法)

当我尝试插入ContentValues时:

E / SQLiteLog:(1)在“ null”附近:语法错误E / SQLiteDatabase:插入android.database.sqlite.SQLiteException:在“ null”附近:语法错误(代码1):,同时编译:INSERT INTO TABLE_NAME (空)值(NULL)在android.database.sqlite.SQLiteConnection.nativePrepareStatement(本地方法)在android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)

1 个答案:

答案 0 :(得分:0)

发生错误是因为在下面传递了string变量:

void android.database.sqlite.SQLiteDatabase.execSQL(java.lang.String)

DEBUG模式下发生的过程不应被视为最终决定。 Runtime Procedures更加可靠,因为它们在真实环境中执行,并且最终用户将如何使用该应用程序。

在旁注中,AsyncTask@Deprecated,应尽可能避免使用。

如果您使用的是JAVA,请尝试ExecutorsHandlers。 如果您使用的是KOTLIN,请尝试Coroutines。 您可以对两者都使用RxJava,但这有其自身的复杂性。