Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从资产文件夹复制SQLite数据库问题_Android_Android Sqlite - Fatal编程技术网

Android 从资产文件夹复制SQLite数据库问题

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:

有人能给我指一下正确的方向吗。我可以在/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: 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();
    }
}