【问题标题】:Open SQLite database with specified path with Room使用 Room 打开指定路径的 SQLite 数据库
【发布时间】:2018-03-17 00:01:18
【问题描述】:

我正在尝试通过使用 Room 库指定其路径来访问 Android 内部存储上的数据库。到目前为止,我一直在使用以下语句:

dbPath = "/data/data/my.sqlitetesting/files/database/myDataBase.db";
SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE);

如何使用 Room 访问此数据库?

【问题讨论】:

  • AFAIK 你必须实现自定义 SupportSQLiteOpenHelperSupportSQLiteOpenHelper.Factory 然后使用 RoomDatabase.Builder.openHelperFactory .... AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").openHelperFactory(customFactory)build();
  • 首先,将 Room 放在一边。永远不要硬编码路径。对于许多 Android 设备,基于操作系统版本或用户(例如,辅助帐户),该硬编码值是错误的。您的硬编码值或多或少映射到new File(new File(getFilesDir(), "database"), "myDataBase.db"))。但是我同意塞尔文的观点;因为您的数据库位于非标准位置,AFAIK 您将需要一个自定义的SupportSQLiteOpenHelper,它可以在运行时派生正确的位置。
  • '@CommonsWare 你是对的,我实际上并没有对其进行编码,我只是想展示这样的路径可能是什么样子。
  • 但是,我们将如何实现SupportSQLiteOpenHelper?因为,我们需要返回SupportSQLiteDatabase。实现SupportSQLiteOpenHelper接口,与扩展SQLiteOpenHelper(是一个抽象类)不同

标签: android sqlite android-sqlite android-room


【解决方案1】:

据我所知,目前无法将 db 文件导入房间。但还有另一种方式:How to use Room Persistence Library with pre-populated database?

你也可以试试这个库:RoomAsset

【讨论】:

    【解决方案2】:

    @Jan Malek 我使用此代码知道我是否有 SD 卡并获取路径 NO SD CARD 然后我得到内部存储的路径

        public void onAvail() {
    
        String state = Environment.getExternalStorageState();
    
        if (state.equals(Environment.MEDIA_MOUNTED) && (!state.equals(Environment.MEDIA_MOUNTED_READ_ONLY))) {
    
            File removable = ContextCompat.getExternalFilesDirs(this, null)[1];
            THE_PATH = String.valueOf(removable) + "/Documents/";
    
            //System.out.println("ALL TRUE ==> " + THE_PATH);
    
        } else {// if (state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
            THE_PATH = "";
            //System.out.println("ALL FALSE ==> "+ THE_PATH);
        }
    }
    

    尝试这几行代码我认为您发布的代码中的路径不正确,如果这不起作用,请告知我们

            Context context = this;
        String removable = getFilesDir().getAbsolutePath();
        THE_PATH = String.valueOf(removable)+"/";
        System.out.println("INTERNAL PATH ======> "+THE_PATH);
        File file = new File(context.getFilesDir(), "NAME_OF_FILE");
        String PA = String.valueOf(file);
        System.out.println("Where AM  I ======> "+PA);
    

    【讨论】:

    • @janmalek 我不介意投反对票说你接受了答案,点击向上按钮对我来说似乎是合乎逻辑的,但我有两个反对票,不明白为什么有人可以解释跨度>
    • 您的回复没有回答我的问题。我在问如何使用 Room 库连接到 SQLite 数据库。我不是在问如何获取此类数据库的路径。
    猜你喜欢
    • 1970-01-01
    • 2021-08-13
    • 2018-12-27
    • 2012-07-30
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多