Olá pessoal, tudo bom ?
Fiz a implementação corretamente do Room funcionou certinho nos meus testes, mas ao fazer a adição com as sincronias ocorreu o seguinte erro:
Caused by: android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787 SQLITE_CONSTRAINT_FOREIGNKEY[787])
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:995)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at androidx.sqlite.db.framework.FrameworkSQLiteStatement.executeInsert(FrameworkSQLiteStatement.java:51)
at androidx.room.EntityInsertionAdapter.insert(EntityInsertionAdapter.java:64)
at br.com.sat.cronos.database.dao.tarefa.TarefaDAO_Impl.inserir(TarefaDAO_Impl.java:142)
at br.com.sat.cronos.database.dao.tarefa.TarefaDAO_Impl.inserir(TarefaDAO_Impl.java:17)
at br.com.sat.cronos.repository.tarefa.TarefaRepository$salvar$1.invoke(TarefaRepository.kt:37)
at br.com.sat.cronos.repository.tarefa.TarefaRepository$salvar$1.invoke(TarefaRepository.kt:11)
at br.com.sat.cronos.asynctask.BaseAsyncTask.doInBackground(BaseAsyncTask.kt:12)
at br.com.sat.cronos.asynctask.BaseAsyncTask.doInBackground(BaseAsyncTask.kt:7)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
Acabei criando um BaseDao que recebe um generic para que eu possa usar de forma dinâmica:
package br.com.sat.cronos.database.dao
import androidx.annotation.WorkerThread
import androidx.room.*
/**
* Classe base de DAO
* @author Gustavo Pinto
* @version 1.0
* @since 1.0
*
*/
@Dao
interface BaseDAO<T> {
/**
* Insere um objeto no banco de dados
*
* @param obj
*/
@Insert
fun inserir(obj: T)
/**
* Insere um array de objetos no banco de dados
*
* @param list
*/
@Insert(onConflict = OnConflictStrategy.REPLACE)
@WorkerThread
fun inserir(list: List<T>)
/**
* Atualizar um objeto no banco de dados
*
* @param obj
*/
@Update
fun atualizar(obj: T)
/**
* Remove um objeto do banco de dados
*
* @param obj
*/
@Delete
fun remover(obj: T)
}
E faço a chamada da seguinte forma ao inserir:
fun salvar(ta: Tarefa, callback: (Unit?) -> Unit) {
try {
BaseAsyncTask(executar = {
if (buscaPorId(ta.id) == null) {
dao?.inserir(ta)
} else {
dao?.atualizar(ta)
}
}, finaliza = callback)
.execute()
} catch (erro: Exception) {
CrashlyticsUtil.enviaErro(context, TAG, erro)
}
}
Assim gostaria de saber como eu poderia fazer para tratar esse erro para não crashar a aplicação e enviar para a função que chamou a função de inserir do BaseDao o erro para conseguir enviar para a minha classe CrashlyticsUtil.