我正在一个通过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)
答案 0 :(得分:0)
发生错误是因为在下面传递了string
变量:
void android.database.sqlite.SQLiteDatabase.execSQL(java.lang.String)
在DEBUG
模式下发生的过程不应被视为最终决定。 Runtime Procedures
更加可靠,因为它们在真实环境中执行,并且最终用户将如何使用该应用程序。
在旁注中,AsyncTask
是@Deprecated
,应尽可能避免使用。
如果您使用的是JAVA
,请尝试Executors
或Handlers
。
如果您使用的是KOTLIN
,请尝试Coroutines
。
您可以对两者都使用RxJava
,但这有其自身的复杂性。