gpt4 book ai didi

android - 使用 Room 递归调用 getDatabase

转载 作者:行者123 更新时间:2023-12-02 18:58:09 25 4
gpt4 key购买 nike

当我尝试初始化数据库时遇到错误。我正在使用 Android Room,我想使用 RoomDatabaseBuilder 来执行回调并填充我的数据库。

我在 Activity 类中执行 getDatabase 方法,但随后我使用 dao 从数据库获取信息,应用程序崩溃了。这是我第一次接触 Android Room,也许我忘记了一些重要的事情。有谁可以帮我解决这个问题吗?

数据库类:

static RoomDatabase.Callback rdc = new RoomDatabase.Callback() {

@Override
public void onOpen(@NonNull SupportSQLiteDatabase db) {
super.onOpen(db);
Log.d(TAG, "Debug: onOpen");

//Borramos todos los sonidos de la base de datos
INSTANCE.soundsDao().deleteAllSounds(); // Instance is "private static DatabaseSounds INSTANCE;"

Activity 行崩溃来源:

db = DatabaseSounds.getDatabase(getApplicationContext());
AsyncTask task = new LoadGridAsyncTask().execute(); **

private class LoadGridAsyncTask extends AsyncTask<Void, Void, Integer> {

@Override
protected Integer doInBackground(Void... voids) {
//Extraemos el listado de sonidos y los convertimos a DTO
List<EntitySounds> listSounds = db.soundsDao().getAll(); **** THIS is the line of crash

这是错误

java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:325)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
Caused by: java.lang.IllegalStateException: getDatabase called recursively
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:203)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:96)
at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:54)
at android.arch.persistence.room.RoomDatabase.compileStatement(RoomDatabase.java:244)
at android.arch.persistence.room.SharedSQLiteStatement.createNewStatement(SharedSQLiteStatement.java:65)
at android.arch.persistence.room.SharedSQLiteStatement.getStmt(SharedSQLiteStatement.java:72)
at android.arch.persistence.room.SharedSQLiteStatement.acquire(SharedSQLiteStatement.java:87)
at com.genaut.myapp.database.dao.DaoSounds_Impl.deleteAllSounds(DaoSounds_Impl.java:140)
at com.genaut.myapp.database.DatabaseSounds$1.onOpen(DatabaseSounds.java:57)
at com.genaut.myapp.database.DatabaseSounds_Impl$1.onOpen(DatabaseSounds_Impl.java:65)
at android.arch.persistence.room.RoomOpenHelper.onOpen(RoomOpenHelper.java:111)
at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onOpen(FrameworkSQLiteOpenHelper.java:149)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:266)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:96)
at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:54)
at android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:233)
at com.genaut.myapp.database.dao.DaoSounds_Impl.getAll(DaoSounds_Impl.java:155)
at com.genaut.myapp.Home$LoadGridAsyncTask.doInBackground(Home.java:83)
at com.genaut.myapp.Home$LoadGridAsyncTask.doInBackground(Home.java:78)
at android.os.AsyncTask$2.call(AsyncTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
at java.lang.Thread.run(Thread.java:761)

这是 Dao 方法:

@Query("SELECT * FROM entitysounds")
List<EntitySounds> getAll();

 

最佳答案

but then I use the dao to get info from database

这不起作用,因为房间尚未设置。要么:

  • RoomDatabase.Callback 之外执行此工作,或者

  • 不要在 RoomDatabase.Callback 内部使用 Room,而是使用作为 onOpen() 参数提供的 SupportSQLiteDatabase 和其他回调方法

关于android - 使用 Room 递归调用 getDatabase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50775527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com