Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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 从Assest文件夹复制到当前数据库路径时出错..输入流错误_Android_Database_Inputstream - Fatal编程技术网

Android 从Assest文件夹复制到当前数据库路径时出错..输入流错误

Android 从Assest文件夹复制到当前数据库路径时出错..输入流错误,android,database,inputstream,Android,Database,Inputstream,这是我的DBhelper类。我想将数据库从assest文件夹复制到当前的数据库路径。我在CopyDatabase函数的InputStream中遇到错误。请提供帮助 package com.example.dbtest; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; imp

这是我的DBhelper类。我想将数据库从assest文件夹复制到当前的数据库路径。我在CopyDatabase函数的InputStream中遇到错误。请提供帮助

   package com.example.dbtest;

   import java.io.FileOutputStream;
   import java.io.IOException;
   import java.io.InputStream;
   import java.io.OutputStream;
   import java.util.ArrayList;
   import java.util.List;

   import android.content.Context;
   import android.database.Cursor;
   import android.database.SQLException;
   import android.database.sqlite.SQLiteDatabase;
   import android.database.sqlite.SQLiteException;
   import android.database.sqlite.SQLiteOpenHelper;
   import android.os.Environment;




      public class DBhelper extends SQLiteOpenHelper{


private static String DB_PATH = "/data/data/com.example.dbtest/databases/";
private static String DB_NAME = "photodb";
private SQLiteDatabase myDataBase; 
private final Context myContext;
File dbFile;
File dbFilepath;


public DBhelper(Context context) { 

    super(context, DB_NAME, null, 1);
    String state=Environment.getExternalStorageState();
    System.out.println("My Storage State:-"+state);

    this.myContext = context;

}   


public void createDataBase() throws IOException{

    boolean dbExist = checkDataBase();
    if(dbExist){
        System.out.println("Ufffff");
        String path = dbFile.getAbsolutePath();

        System.out.println("My database Path:--"+path);
    }
    if(!dbExist)
    {
        dbFile= new     File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+"Dbtest");
        boolean flag=dbFile.mkdir();
        dbFilepath = new       File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+"Dbtest"+"    /"+"photodb");
        dbFilepath.createNewFile();


        System.out.println("Ufffff naaa..File hoeche?..."+flag);
        try {
            copyDataBase(myContext); 
        } catch (IOException e) {
            throw new Error("Error copying database");
        }
    }   



}

public boolean checkDataBase()
{
    dbFile = new       File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+"Dbtest"+"      /"+"photodb");
    return dbFile.exists();
}



private void copyDataBase(Context cont) throws IOException{


    InputStream myInput = cont.getAssets().open(DB_NAME);



    String outFileName = dbFilepath.getAbsolutePath();


    OutputStream myOutput = new FileOutputStream(outFileName);
    //OutputStream myOutput1 = new FileOutputStream(outFileName);


    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
        myOutput.write(buffer, 0, length);
    }


    myOutput.flush();
    myOutput.close();
    myInput.close();

}

public void openDataBase() throws SQLException{

    String myPath = dbFile.getAbsolutePath();
    System.out.println("MY DATABASE PATH:----"+myPath);
    myDataBase = SQLiteDatabase.openDatabase(myPath, null,      SQLiteDatabase.OPEN_READWRITE);
}

@Override
public synchronized void close() {
    if(myDataBase != null)
        myDataBase.close();
    super.close();
}

@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}

public void add(String imagepath,String description,String location)
{
    String sql = "insert into photodetails     values(null,'hello','bolo','aache');";
    myDataBase.execSQL(sql);
}
}

我的主要活动是

 public class MainActivity extends Activity {


    DBhelper mydb;
    Context cont;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mydb = new DBhelper(cont);

        try {
            mydb.createDataBase();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        mydb.openDataBase();
        mydb.add("helloworld", "Hoeche", "MGroad");

       // mydb.openDataBase();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

   }
我的日志错误是

  09-03 11:48:40.342: E/AndroidRuntime(27139): java.lang.RuntimeException: Unable to   start activity ComponentInfo{com.example.dbtest/com.example.dbtest.MainActivity}:        java.lang.NullPointerException
    09-03 11:48:40.342: E/AndroidRuntime(27139):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
   09-03 11:48:40.342: E/AndroidRuntime(27139):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
   09-03 11:48:40.342: E/AndroidRuntime(27139):     at android.app.ActivityThread.access$700(ActivityThread.java:140)
   09-03 11:48:40.342: E/AndroidRuntime(27139):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
  09-03 11:48:40.342: E/AndroidRuntime(27139):  at android.os.Handler.dispatchMessage(Handler.java:99)
   09-03 11:48:40.342: E/AndroidRuntime(27139):     at android.os.Looper.loop(Looper.java:137)
   09-03 11:48:40.342: E/AndroidRuntime(27139):     at android.app.ActivityThread.main(ActivityThread.java:4921)
   09-03 11:48:40.342: E/AndroidRuntime(27139):     at java.lang.reflect.Method.invokeNative(Native Method)
   09-03 11:48:40.342: E/AndroidRuntime(27139):     at java.lang.reflect.Method.invoke(Method.java:511)
   09-03 11:48:40.342: E/AndroidRuntime(27139):     at  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
   09-03 11:48:40.342: E/AndroidRuntime(27139):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
   09-03 11:48:40.342: E/AndroidRuntime(27139):     at dalvik.system.NativeStart.main(Native Method)
   09-03 11:48:40.342: E/AndroidRuntime(27139): Caused by: java.lang.NullPointerException
   09-03 11:48:40.342: E/AndroidRuntime(27139):     at com.example.dbtest.DBhelper.copyDataBase(DBhelper.java:98)
   09-03 11:48:40.342: E/AndroidRuntime(27139):     at com.example.dbtest.DBhelper.createDataBase(DBhelper.java:77)
   09-03 11:48:40.342: E/AndroidRuntime(27139):     at com.example.dbtest.MainActivity.onCreate(MainActivity.java:25)
   09-03 11:48:40.342: E/AndroidRuntime(27139):     at android.app.Activity.performCreate(Activity.java:5206)
   09-03 11:48:40.342: E/AndroidRuntime(27139):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
   09-03 11:48:40.342: E/AndroidRuntime(27139):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
  09-03 11:48:40.342: E/AndroidRuntime(27139):  ... 11 more
更新

即使我换行写

            AssetManager myassest = cont.getAssets();
    InputStream myInput = myassest.open("photodb");
它在cont.getAssets()中给了我错误;它说空指针异常

试试这个

public final static String APP_PATH_SD_CARD = "/database";
    private static final String DATABASE_NAME = "photodb.db";


  private boolean checkDataBase(){
                boolean checkdb = false;
                try{
                    String myPath = context.getFilesDir().getAbsolutePath().replace("files", "databases")+File.separator + DATABASE_NAME;
                    File dbfile = new File(myPath);                
                    checkdb = dbfile.exists();
                }
                catch(SQLiteException e){
                    System.out.println("Database doesn't exist");
                }

                return checkdb;
            }

此错误是由于您将空上下文
cont
传递给
DBhelper
类,但
cont
未初始化。将您的
onCreate()
更改为

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mydb = new DBhelper(MainActivity.this);

        try {
            mydb.createDataBase();
        } catch (IOException e) {
            e.printStackTrace();
            Log.e("MainActivity", "Got IOException  = " + e.getMessage());
        }

        mydb.openDataBase();
        mydb.add("helloworld", "Hoeche", "MGroad");

       // mydb.openDataBase();
    }
并使用与扩展名为
(photodb.db或photodb.sqlite)
的资产中的db相同的名称,而不是

private static String DB_NAME = "photodb";

你能在扩展名为means.db或.sqlite的资产中告诉我你的db名称吗?我对checkDataBase没有问题…我在INPUTSTREAM中有问题…它无法从assest Folder中读取,因为你的数据库不是以.db或.sqlite启动的,所以你为什么要告诉我修改checkDataBase函数?不..这与.db或.sqlite无关.sqlite并使用上面的代码检查数据库,我希望它能工作