【问题标题】:.How to copy files from project assets folder to device data folder in android studio?.如何将文件从项目资产文件夹复制到android studio中的设备数据文件夹?
【发布时间】:2020-04-08 03:08:39
【问题描述】:

我正在尝试使用SQLiteAssetHelper,它需要我在PC 上创建数据库并将其复制到assets/databases/databasename.db。我这样做了,但是当我检查设备时,我的应用程序的数据文件夹下也没有数据库文件夹。

我是根据视频做的,那里的人没有做任何其他事情来制作副本。

那么,文件是否应该自动复制到设备上? 如果没有,我该如何复制文件?

【问题讨论】:

  • 我已经知道了,但这不是我想要的,我想从电脑上的 android 项目资产文件夹中获取文件复制到手机上的数据文件夹

标签: android sqlite file-copying android-assets


【解决方案1】:

出于安全考虑,您所解释的过程需要对设备上的应用程序存储进行 root 访问,这在普通的非 root 设备上是不可能的。为此,您需要有根设备您可以在 Android Studio 中使用模拟器,这是一种更简单且用户友好的方法:

Android Studio 打开模拟器 -> Settings -> Memory -> Internal Storage -> 其他

将打开一个弹出窗口。点击探索。您将可以访问应用的内部存储空间,以便您也可以管理数据库文件夹。

P.S.:另外,您可以将您的应用程序与您拥有的数据库表打包,就像任何其他文件一样,只需将其放在您的 src/main/assets 文件夹下并在运行时从代码访问。此线程中提供了代码示例:Android - Copy assets to internal storage(@Ezaldeen sahb 建议)

【讨论】:

  • 这就是我想要解释的,我确实将数据库文件放在了 src/main/assets 下。我使用的库 SQLiteAssetHelper 应该在 data/data/my.package.name/databases/mydatabase.db 下找到该文件 问题是,该文件不存在。我使用模拟器,我在工具->查看 Windows->设备文件资源管理器中查看它。数据库文件夹根本不存在
【解决方案2】:

那么,文件是否应该自动复制到设备上?如果没有,我该如何复制文件?

是的,但只有在尝试访问数据库时才会这样做。仅实例化扩展 SQLiteAssetHelper 的类不会复制数据库,因此如果仅此而已,则数据库将不可见。

使用SQliteAssetHelper时的步骤应该是:-

  1. 创建您的项目。
  2. 修改 build.gradle 以在依赖项部分包含 implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:+'
  3. 创建assets文件夹,然后在assets文件夹中创建databases文件夹,
  4. 将数据库文件复制到数据库文件夹中。
  5. 创建扩展 SQliteAssetHelper 的 Database Helper 类。
  6. 实例化数据库助手
  7. 访问数据库(这是复制数据库的时间)。

如果您在执行第 5 步时使用,例如(基于问题中的信息):-

public class DatabaseHelper extends SQLiteAssetHelper {

    public static final String DATABASENAME = "databasename.db"; //<<<<<<<<< MUST match file name in assets/databases
    public static final int DATABASEVERSION = 1;

    public DatabaseHelper(Context context) {
        super(context, DATABASENAME, null, DATABASEVERSION);
        this.getWritableDatabase(); //<<<<< will force database access and thus copy database from assets
    }
}

然后在执行 6(实例化数据库助手)时,则执行 7,因为 this.getWritableDatabase(); 访问(隐式打开)数据库。

例如

public class MainActivity extends AppCompatActivity {

    DatabaseHelper mDBHelper; //<<<<< declares the database helper

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDBHelper = new DatabaseHelper(this); // instantiates the database helper
    }
}

【讨论】:

  • 谢谢!我做了你描述的一切。您的回答很完美,但是,我的问题不是我想的那样。我只是不小心在 SQLiteAssetHelper 构造函数中传递了空指针。
猜你喜欢
  • 2011-08-07
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
相关资源
最近更新 更多