【问题标题】:How can I share a db file between 2 applications如何在 2 个应用程序之间共享 db 文件
【发布时间】:2022-01-19 18:16:54
【问题描述】:

因为Enviroment.getExternalStorageDirectory() 已被弃用,我有一个小问题。我有 2 个应用程序(一个应用程序的精简版和一个专业版)。这些应用程序有一个我可以导出和导入的数据库。当从 lite 应用程序切换到 pro 应用程序时,用户可以将“旧”数据库导入新应用程序。该数据库存储在他的“sdcard”内的一个文件夹下。但现在在 Android 12 设备上,我们无法再访问该外部存储。

那么我该如何解决这个问题呢?

因为我认为,context.getExternalFilesDir((Environment.DIRECTORY_DOCUMENTS) 不起作用,因为两个应用程序的命名空间不同。而且我想打开一个不在请求文件的应用程序名称空间下的文件是行不通的。

【问题讨论】:

    标签: java android androidx


    【解决方案1】:

    是的,无法与他人共享应用程序的共享内存。 其他选项是使用外部服务器/Firbase 为用户创建配置文件并将数据存储在其中。

    【讨论】:

      【解决方案2】:

      最简单的方法是不要拥有两个应用程序。使单个应用程序适用于两种模式,并根据许可证类型在运行时门控功能。您甚至可以通过应用内购买进行升级。

      【讨论】:

        【解决方案3】:

        我自己找到了解决方案,但如果其他人正在寻找解决方案,它可能会有所帮助。

        我要求用户通过

        指定文件位置
        Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("application/db");
        intent.putExtra(Intent.EXTRA_TITLE, "xyz.db");
        
        mCreateNewDatabaseFile.launch(intent);
        

        然后在mCreateNewDatabaseFile

        private final ActivityResultLauncher<Intent> mCreateNewDatabaseFile = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
            if (result.getResultCode() == RESULT_OK) {
                if (result.getData() != null && result.getData().getData() != null) {
                    Uri path = result.getData().getData();
                    getContentResolver().takePersistableUriPermission(path, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                    getContentResolver().takePersistableUriPermission(path, Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    mPreferences.edit().putString(PREF_KEY_DATABASE_EXPORT_PATH, path.toString()).apply();
                }
            }
        });
        

        因此,即使使用另一个进程,我也可以读取和写入文件。

        所以在精简版中我可以创建 db 文件,在专业版中我可以让用户选择这个文件进行导入。

        我希望它能帮助其他有类似问题的人。

        【讨论】:

          【解决方案4】:

          您可以(应该)使用 ContentProvider 让其他应用使用 ContentProvider 的可访问方法查询您的数据库:

          您可以配置内容提供程序以允许其他应用程序 安全地访问和修改您的应用数据

          (这将强制执行Single-responsibility principle

          【讨论】:

          • 好吧,这也是一个选项,我会看看它是否比Intent.ACTION_CREATE_DOCUMENT的解决方案更好
          猜你喜欢
          • 2013-04-09
          • 1970-01-01
          • 1970-01-01
          • 2012-12-30
          • 1970-01-01
          • 2014-09-30
          • 2020-06-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多