当前位置: 首页 > 知识库问答 >
问题:

如何更改房间数据库的默认数据库文件位置?

颛孙嘉玉
2023-03-14

我在我的应用程序中使用RoomDB。其实我想看db文件。

getDatabasePath("user.db").getAbsolutePath();

上面的代码是给我db文件所在的目录保存目录是这样的

 /data/data/com.example.manvish.roomdb/databases/user.db

但我仍然无法从命令提示符下使用sudo访问数据目录。现在我想把DB文件的位置改成内存或SD卡中的其他文件夹。我该怎么做?

共有3个答案

严兴言
2023-03-14

不确定这是不是你正在寻找的,但在我的情况下,就像@M. Yogeshwaran一样,我需要能够设置数据库的初始状态,并从那里开始工作,所以我最终这样做了:

/**
 * @param context
 */
public DatabaseService(Context context) {

        File dst = context.getDatabasePath(DB_NAME);
        dst.delete();
        File src = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath()+"/database.db");
        try {
            copy(src,dst);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Init the database singleton
        db = Room.databaseBuilder(context, CrediforceDatabase.class, Constants.DB_NAME).build();
}

public static void copy(File src, File dst) throws IOException {
    try (InputStream in = new FileInputStream(src)) {
        try (OutputStream out = new FileOutputStream(dst)) {
            // Transfer bytes from in to out
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
        }
    }
}

更清楚一点:

  1. DB_NAME=“database.DB”
  2. 出于测试目的,我在下载文件夹中有我想“导入”的“database.db”,稍后我会转换这些代码,这样设备就会从服务器中提取初始数据库
  3. dst。删除();只是在测试时删除现有的数据库文件(不确定是否需要)
  4. 这基本上可以理解为:启动应用程序

此外,我从这个答案中得出了这个想法:https://stackoverflow.com/a/50383879/2150472

希望它能帮助任何人!

另外,如果您需要的只是能够看到数据并执行积垢操作,那么您可以始终使用以下方法:https://github.com/amitshekhariitbhu/Android-Debug-Database

柳项明
2023-03-14

要更改数据库位置,只需在构建房间数据库时将路径(例如文件夹中的数据库)放入内部存储

fun getDatabase(context: Context, scope: CoroutineScope):   TestDatabase {
            return INSTANCE ?: synchronized(this) {
                val instance =
                    Room.databaseBuilder(
                        context.applicationContext,
                        TestDatabase::class.java,
                        Environment.getExternalStorageDirectory().absolutePath + "/yourFolder/yourdb"
                    ).build()
                INSTANCE = instance
                return instance
            }
        }
宗政博文
2023-03-14

Java解决方案:

  1. 在清单中授予权限
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
private static final String DB_NAME = "stack_overflow_db";
private static final String DB_PATH = String.format("%s/%s",
 Environment.getExternalStorageDirectory().getAbsolutePath(), DB_NAME);
    public static synchronized SofDatabase getInstance(Context aContext) {
        if (sInstance == null) {
            sInstance = Room.databaseBuilder(aContext, SofDatabase.class, DB_PATH)
                    .fallbackToDestructiveMigration()
                    .addCallback(roomCallback).build(); //adding callback from Room
        }
        return sInstance;
    }

回拨

     /**
     * Get Notified once db is created
     */
    private static final RoomDatabase.Callback roomCallback = new RoomDatabase.Callback() {
        @Override
        public void onCreate(@NonNull SupportSQLiteDatabase db) {
            super.onCreate(db);
            Log.i("SOF", db.getPath()); //which prints out -->  I/SOF: /storage/emulated/0/stack_overflow_db
            // add some jobs once db is created
        }
    };
 类似资料:
  • 问题内容: PostgreSQL将所有数据库保留在Linux上的默认目录是什么? 问题答案: “ PostgreSQL将保留所有数据库的目录 ”(和配置)称为“数据目录”,它对应于PostgreSQL所谓的“ 数据库集群 ” (有点混乱),该数据库集群与分布式计算无关,它只是表示一个组PostgreSQL服务器管理的数据库和相关对象的数量。 数据目录的位置取决于分布。如果从源代码安装,则默认值为:

  • 错误:查询有问题:[SQLITE_ERROR]SQL错误或缺少数据库(没有这样的表:任务) 显示了这个错误,我怎么可能修复它? 我正在学习这个教程

  • 并且我发现了基于数据库版本4的可能场景的迁移varargs。 我的问题是,假设我使用的是db v1的Room,当我的应用程序到达db v10时,我将不得不编写多少迁移方法? 在sqlite中,我们在中获得已安装应用程序的当前db版本,我们只需通过开关大小写而不使用break语句,以便满足所有db升级。

  • 我是新来的和我试图我的得到一个从它。我试图这样做的它与这是id但问题是我不知道如何返回目标从。 这就是<代码>刀 这是Repository类

  • 我尝试在Android房间中附加数据库,如下所示:如何从Android房间中的多个数据库中进行选择(如何附加数据库),但在构建项目时出现错误:错误:查询有问题:[SQLITE\u错误]SQL错误或缺少数据库(没有这样的表:database.table)错误 当我添加@SkipQuery验证时,错误发生了变化:错误:不确定如何将游标转换为此方法的返回类型。 当我从查询中删除“myDatabase.”

  • 我转换java代码到kotlin代码,我得到类型未解决的java类错误。 我的Java类是 已转换的Kotlin类 非常感谢。