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

Posted

技术标签:

【中文标题】如何从 Room 数据库中获取 SQLite 数据库实例引用?【英文标题】:How to get the SQLite database instance reference from the Room database? 【发布时间】:2021-12-02 17:29:30 【问题描述】:

我正在尝试从现有 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

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

【问题讨论】:

【参考方案1】:

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

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

所以:-

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(); tableName 作为函数参数出现。如果不按照您在第二个示例中的建议重新启动数据库,我找不到任何资源如何使用 Room 进行操作。

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

    sdb = db.getSQliteDB();

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

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

【讨论】:

您好,感谢您的快速回答。 SupportSQLiteDatabase 中似乎缺少一些函数。例如,rawQuery 函数未列出,我已经在下面使用它来检索给定表的列名; 光标 c = db.rawQuery("SELECT * FROM "+tableName+" WHERE 0", null); columnNames = c.getColumnNames(); tableName 作为函数参数出现。如果没有按照您在第二个示例中的建议重新启动数据库,我找不到任何资源如何使用 Room 进行操作。我在 Dao 类上尝试了 RawQuery,但它似乎需要一个类型化的类来返回结果。您知道如何使用 Room 获取列名吗?在此链接中已经有问题,但没有答案。 ***.com/questions/53077570/…

以上是关于如何从 Room 数据库中获取 SQLite 数据库实例引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Android Room 从数据库中获取一行? [复制]

Room----Android数据库(SQLite)

如何将现有的 sqlite 表迁移到具有 VARCHAR、TIMESTAMP 等数据类型的 ROOM Db?

Android 数据库 Room从入门到进阶

为啥 Room 不从资产中填充数据库?

如何从 api 获取数据并将数据插入 Android Studio 中的 ROOM(数据库)?