Android 从资产文件夹复制SQLite数据库问题
有人能给我指一下正确的方向吗。我可以在/data/data/mypacket/databases中创建一个空数据库,但无法从assets文件夹复制我的数据库?有什么建议吗?谢谢你的帮助 代码: 日志:Android 从资产文件夹复制SQLite数据库问题,android,android-sqlite,Android,Android Sqlite,有人能给我指一下正确的方向吗。我可以在/data/data/mypacket/databases中创建一个空数据库,但无法从assets文件夹复制我的数据库?有什么建议吗?谢谢你的帮助 代码: 日志: 09-03 02:22:32.459: E/AndroidRuntime(19099): FATAL EXCEPTION: main 09-03 02:22:32.459: E/AndroidRuntime(19099): java.lang.IllegalStateException:
09-03 02:22:32.459: E/AndroidRuntime(19099): FATAL EXCEPTION: main
09-03 02:22:32.459: E/AndroidRuntime(19099): java.lang.IllegalStateException: Could not execute method of the activity
09-03 02:22:32.459: E/AndroidRuntime(19099): at android.view.View$1.onClick(View.java:3597)
09-03 02:22:32.459: E/AndroidRuntime(19099): at android.view.View.performClick(View.java:4202)
09-03 02:22:32.459: E/AndroidRuntime(19099): at android.view.View$PerformClick.run(View.java:17340)
09-03 02:22:32.459: E/AndroidRuntime(19099): at android.os.Handler.handleCallback(Handler.java:725)
09-03 02:22:32.459: E/AndroidRuntime(19099): at android.os.Handler.dispatchMessage(Handler.java:92)
09-03 02:22:32.459: E/AndroidRuntime(19099): at android.os.Looper.loop(Looper.java:137)
09-03 02:22:32.459: E/AndroidRuntime(19099): at android.app.ActivityThread.main(ActivityThread.java:5039)
09-03 02:22:32.459: E/AndroidRuntime(19099): at java.lang.reflect.Method.invokeNative(Native Method)
09-03 02:22:32.459: E/AndroidRuntime(19099): at java.lang.reflect.Method.invoke(Method.java:511)
09-03 02:22:32.459: E/AndroidRuntime(19099): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
09-03 02:22:32.459: E/AndroidRuntime(19099): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
09-03 02:22:32.459: E/AndroidRuntime(19099): at dalvik.system.NativeStart.main(Native Method)
09-03 02:22:32.459: E/AndroidRuntime(19099): Caused by: java.lang.reflect.InvocationTargetException
09-03 02:22:32.459: E/AndroidRuntime(19099): at java.lang.reflect.Method.invokeNative(Native Method)
09-03 02:22:32.459: E/AndroidRuntime(19099): at java.lang.reflect.Method.invoke(Method.java:511)
09-03 02:22:32.459: E/AndroidRuntime(19099): at android.view.View$1.onClick(View.java:3592)
09-03 02:22:32.459: E/AndroidRuntime(19099): ... 11 more
09-03 02:22:32.459: E/AndroidRuntime(19099): Caused by: java.lang.Error: Error copying database
09-03 02:22:32.459: E/AndroidRuntime(19099): at com.petermihaylov.scjajavaexamquestions.DataBaseHelper.createDataBase(DataBaseHelper.java:56)
09-03 02:22:32.459: E/AndroidRuntime(19099): at com.petermihaylov.scjajavaexamquestions.TestAdapter.createDatabase(TestAdapter.java:25)
09-03 02:22:32.459: E/AndroidRuntime(19099): at com.petermihaylov.scjajavaexamquestions.TrueAndFalse.testasd(TrueAndFalse.java:25)
09-03 02:22:32.459: E/AndroidRuntime(19099): ... 14 more
几点建议:
- 检查应用程序的“资产”文件夹(而不是“原始”文件夹)中是否存在文件“DB_NAME”
- 如果资产文件扩展名为“.gz”,则将删除该扩展名
- 资产文件不应大于1MB。如果是这种情况,请尝试将其压缩并解压缩到数据库文件夹
- 复制文件之前,请检查“outFileName”的路径是否存在(即“新建文件(outFileName).getParentFile().mkdirs()”`
- 检查“DB_路径”是否根据API版本正确构建。
此外,不要忘记创建
android\u元数据表,如中所述。我的问题的解决方案如下:
由于androidstudio使用新的基于Gradle的构建系统,您应该将assets/放在源代码集中,例如myproject/src/main/assets/
我创建了自己的资产文件夹,并将其放在Eclipse通常放置的位置……这给我带来了所有这些问题。下面是一些代码,可以将资产数据库文件夹复制到外部存储文件夹。
文件需要位于assets\databases文件夹下
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.app.Activity;
import android.media.MediaScannerConnection;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
public class Options extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.options);
}
public void backupDatabase(View v) throws IOException {
if (Environment.getExternalStorageState() != null)
{
File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyApp");
if (dir.exists()) {
//dir.delete();
}
else {
dir.mkdir();
}
String fromPath = "";
if(android.os.Build.VERSION.SDK_INT >= 4.2){
fromPath = getApplicationInfo().dataDir + "/databases/" + "wl.db";
}
else
{
fromPath = "/data/data/" + getPackageName() + "/databases/" + "wl.db";
}
String toPath = dir.getAbsolutePath() + "/wl.db";
fileCopy(new File(fromPath), new File(toPath));
//This is to refresh the folders in Windows USB conn.
MediaScannerConnection.scanFile(this, new String[] { Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyApp" }, null, null);
MediaScannerConnection.scanFile(this, new String[] { toPath }, null, null);
}
}
public void fileCopy(File src, File dst) throws IOException {
InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
}
考虑Mlong的长度,只需获取长的值;我正在使用Android Studio来创建我的项目,没有资产文件夹。也许我需要查看它并确保它在正确的位置/名称。没有文件扩展,DB小于1MB DB路径,并将空DB放置在正确的位置。剩下的唯一一件事应该是确保我的资产文件夹没有问题。你一定提到过你使用的是“Android Studio”。因为你的问题是用你在这里提到的方法解决的,所以,如果你接受它作为答案会更好。我只能在发布24小时后接受我自己的答案。我不知道android studio可能是问题的原因,尽管我的代码中有一个错误。
if(android.os.Build.VERSION.SDK_INT >= 4.2){
DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
}
else
{
DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.app.Activity;
import android.media.MediaScannerConnection;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
public class Options extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.options);
}
public void backupDatabase(View v) throws IOException {
if (Environment.getExternalStorageState() != null)
{
File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyApp");
if (dir.exists()) {
//dir.delete();
}
else {
dir.mkdir();
}
String fromPath = "";
if(android.os.Build.VERSION.SDK_INT >= 4.2){
fromPath = getApplicationInfo().dataDir + "/databases/" + "wl.db";
}
else
{
fromPath = "/data/data/" + getPackageName() + "/databases/" + "wl.db";
}
String toPath = dir.getAbsolutePath() + "/wl.db";
fileCopy(new File(fromPath), new File(toPath));
//This is to refresh the folders in Windows USB conn.
MediaScannerConnection.scanFile(this, new String[] { Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyApp" }, null, null);
MediaScannerConnection.scanFile(this, new String[] { toPath }, null, null);
}
}
public void fileCopy(File src, File dst) throws IOException {
InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
}