Обновление базы данных происходит сбой только во время выполнения, но не в режиме отладки - PullRequest
0 голосов
/ 21 апреля 2020

Я работаю в проекте, который обновляет базу данных через AsyncTask, когда я запускаю ее в режиме отладки, все идет хорошо, но когда я запускаю ее в режиме бега, используя AVD, он вылетает и выдает следующее сообщение:

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

Как я уже упоминал ранее, ЭТО ПРОИСХОДИТ ТОЛЬКО, ЧТО CRA SH В РЕЖИМЕ РАБОТЫ С AVD !!!

Может кто-нибудь объяснить мне, что происходит?

После предложений Карана Диллона:

Я уже попробовал оба способа, используя Executors (с FixedThreadPool) и HandlerThread, потому что мне нужно вставить несколько новых строк в базу данных, и я даже изменил метод для вставки этих данных, используя ContentValues ​​и SQL Запрос через строку. В процессе работы через AVD все равно получалось следующее сообщение об ошибке: Когда я пытаюсь вставить с SQL Query:

E / AndroidRuntime: FATAL EXCEPTION: Рабочий процесс: com.jagetram.senarand , PID: 6006 android .database.sqlite.SQLiteConstraintException: сбой при ограничении NOT NULL: TABLE_NAME.FIRST_FIELD (код 1299) в android .database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount (собственный метод)

при 1013 * *, когда используется собственный метод Я пытаюсь вставить с ContentValues:

E / SQLiteLog: (1) около «ноль»: синтаксическая ошибка E / SQLiteDatabase: Ошибка при вставке android .database.sqlite.SQLiteException: около «ноль»: синтаксическая ошибка (код 1): во время компиляции: INSERT INTO TABLE_NAME (null) VALUES (NULL) в android .database.sqlite.SQLiteConnection.nativePrepareStatement (собственный метод) в android .database.sqlite.SQLiteConnection.acquirePreparedState. java: 887)

1 Ответ

0 голосов
/ 22 апреля 2020

Ошибка возникает из-за того, что переменная string передается ниже:

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

Процедуры, выполняемые в режиме DEBUG, не должны рассматриваться как окончательные. Runtime Procedures более надежны, так как они выполняются в реальной среде и как ваши конечные пользователи будут использовать приложение.

С другой стороны, AsyncTask - это @Deprecated, и его следует по возможности избегать.

Если вы используете JAVA, попробуйте Executors или Handlers. Если вы используете KOTLIN, попробуйте Coroutines. Вы можете использовать RxJava для них обоих, но это имеет свои сложности.

...