.如何在android studio 中将文件从项目资产文件夹复制到设备数据文件夹?
.How to copy files from project assets folder to device data folder in android studio?
我正在尝试使用 SQLiteAssetHelper
,它要求我在 PC 上创建数据库并将其复制到 assets/databases/databasename.db
。我这样做了,但是当我检查设备时,数据库和数据库文件夹都不在我的应用程序的数据文件夹下。
我是根据视频做的,那里的人没有做任何其他事情来使复制有效。
那么,文件应该自动复制到设备吗?
如果没有,如何复制文件?
您所解释的过程需要对设备上的应用存储进行 root 访问,出于安全考虑,这在普通的非 root 设备上是不可能的。为此,你需要一个 root 设备 或 你可以在 Android Studio 中使用模拟器,这是更简单和用户友好的方法:
从 Android Studio 打开模拟器 -> 设置 -> 内存 -> 内部存储 -> 其他
弹出窗口 window 将打开。单击 探索。您将可以访问应用程序的内部存储空间,因此您也可以管理数据库文件夹。
P.S.: 此外,您可以将您的应用程序与您拥有的数据库 table 打包在一起,就像任何其他文件一样,只需将它在您的 src/main/assets
文件夹下,并在运行时从代码访问。此线程中提供了代码示例:Android - Copy assets to internal storage(@Ezaldeen sahb 建议)
So, are the files supposed to be automatically copied over to device? If not, how can I copy the files?
是的,但只有在尝试访问数据库时才会出现。仅实例化扩展 SQLiteAssetHelper 的 class 将不会复制数据库,因此如果仅此而已,那么数据库将不可见。
使用SQliteAssetHelper的步骤应该是:-
- 创建您的项目。
- 修改 build.gradle 以在依赖项部分包含
implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:+'
。
- 创建 assets 文件夹,然后在 assets 文件夹中创建 databases 文件夹,然后
- 将数据库文件复制到数据库文件夹中。
- 创建扩展 SQliteAssetHelper 的数据库助手 class。
- 实例化数据库助手
- 访问数据库(这是复制数据库的时候)。
如果在执行第 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
,它要求我在 PC 上创建数据库并将其复制到 assets/databases/databasename.db
。我这样做了,但是当我检查设备时,数据库和数据库文件夹都不在我的应用程序的数据文件夹下。
我是根据视频做的,那里的人没有做任何其他事情来使复制有效。
那么,文件应该自动复制到设备吗? 如果没有,如何复制文件?
您所解释的过程需要对设备上的应用存储进行 root 访问,出于安全考虑,这在普通的非 root 设备上是不可能的。为此,你需要一个 root 设备 或 你可以在 Android Studio 中使用模拟器,这是更简单和用户友好的方法:
从 Android Studio 打开模拟器 -> 设置 -> 内存 -> 内部存储 -> 其他
弹出窗口 window 将打开。单击 探索。您将可以访问应用程序的内部存储空间,因此您也可以管理数据库文件夹。
P.S.: 此外,您可以将您的应用程序与您拥有的数据库 table 打包在一起,就像任何其他文件一样,只需将它在您的 src/main/assets
文件夹下,并在运行时从代码访问。此线程中提供了代码示例:Android - Copy assets to internal storage(@Ezaldeen sahb 建议)
So, are the files supposed to be automatically copied over to device? If not, how can I copy the files?
是的,但只有在尝试访问数据库时才会出现。仅实例化扩展 SQLiteAssetHelper 的 class 将不会复制数据库,因此如果仅此而已,那么数据库将不可见。
使用SQliteAssetHelper的步骤应该是:-
- 创建您的项目。
- 修改 build.gradle 以在依赖项部分包含
implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:+'
。 - 创建 assets 文件夹,然后在 assets 文件夹中创建 databases 文件夹,然后
- 将数据库文件复制到数据库文件夹中。
- 创建扩展 SQliteAssetHelper 的数据库助手 class。
- 实例化数据库助手
- 访问数据库(这是复制数据库的时候)。
如果在执行第 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
}
}