如何从 Room 数据库获取 SQLite 数据库实例引用?

How to get the SQLite database instance reference from the Room database?

我正在尝试从现有的 Room 数据库中获取 SQLiteDatabase 实例,以便与许多已经开发的复杂函数一起使用,这些函数接受 SQLiteDatabase 实例作为参数。

我最近迁移到 Room,并决定在我的应用程序的一部分使用从 Room 迁移的功能时不影响一些耗时和长时间的处理功能。(至少在我对 Room 越来越熟悉之前) .

无论如何我不确定这是否可行,如果我仍然能够获得 SQLite 数据库那就太好了。我尝试使用以下代码来检索数据库,但它给了我一个不可转换的错误。

public abstract class Database_ROOM extends RoomDatabase {
    public SQLiteDatabase getSQLiteDB()
    {
        return (SQLiteDatabase) this.mDatabase;
    }
}

以上代码产生以下错误。 不可转换类型;无法将 androidx.sqlite.db.supportSQLiteDatabase 转换为 android.database.sqlite.SQLiteDatabase

有没有其他方法可以获取数据库,或者这是否可能? 任何帮助将不胜感激。

Is there any other way to get the database, or even is this possible? any help would be highly appreciated.

有了房间,您可以通过 getWritableDatabase 方法(或 getReadableDatabase)通过 RoomDatabase getOpenHelper 获得一个 SupportSQLiteDatabase,但在几乎所有情况下您都会获得一个可写数据库。

所以 :-

public SupportSQLiteDatabase getSQliteDB() {
    return this.getOpenHelper().getWritableDatabase();
}
  • 请注意,SupportSQLiteDatabase 具有 SQLiteDatabase 的大部分(但不是全部)功能和方法。

或者,如果你真的想要一个 SQLiteDatabase,那么你可以这样做:-

public SQLiteDatabase getSQLiteDB(Context context, String databaseName) {
    return SQLiteDatabase.openDatabase(context.getDatabasePath(databaseName).getPath(),null,SQLiteDatabase.OPEN_READWRITE);
}

额外

关于评论:-

Cursor c = db.rawQuery("SELECT * FROM "+tableName+" WHERE 0", null); columnNames = c.getColumnNames(); The tableName comes as function parameter. I could not find any resource how to do it using Room, without re-initiating the database as you suggested in second example.

然后您可以使用 SupportSQLiteDatabase 的 query 方法之一,例如:-

    sdb = db.getSQliteDB();

    Cursor csr = sdb.query("SELECT * FROM " + tablename + " WHERE 0");
    String[] columnNames = csr.getColumnNames();
    }
    csr.close();

如果您使用 RoomDatabase 的 rawQuery 方法,那么您必须知道列名并拥有一个包含与列名匹配的成员变量的对象。