2013-08-07 43 views
3

我有我的db.sqlite文件中的文件夾Asset,當我嘗試打開它,我得到這個錯誤:Android的 - 無法打開數據庫

android.database.sqlite.SQLiteCantOpenDatabaseException:未知 錯誤(代碼14 ):無法打開數據庫

我試過不同的路徑和名稱(有和沒有擴展名),但我無法使它工作。

package com.example.APP.db; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import android.content.Context; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.widget.Toast; 

public class DataBaseHelper extends SQLiteOpenHelper { 

// The Android's default system path of your application database. 
private static String DB_PATH = "/data/data/com.example.APP/databases/"; 
private static String DB_NAME = "app"; 
private SQLiteDatabase myDataBase; 
private final Context myContext; 

/** 
* Constructor Takes and keeps a reference of the passed context in order to 
* access to the application assets and resources. 
* 
* @param context 
*/ 
public DataBaseHelper(Context context) { 
    super(context, DB_NAME, null, 1); 
    this.myContext = context; 
} 

/** 
* Creates a empty database on the system and rewrites it with your own 
* database. 
* */ 
public void createDataBase() throws IOException { 
    boolean dbExist = checkDataBase(); 

    if (dbExist) { 
     // do nothing - database already exist 
    } else { 

     // By calling this method and empty database will be created into 
     // the default system path 
     // of your application so we are gonna be able to overwrite that 
     // database with our database. 
     this.getReadableDatabase(); 
     try { 
      copyDataBase(); 
     } catch (IOException e) { 
      throw new Error("Error copying database"); 
     } 
    } 
} 

/** 
* Check if the database already exist to avoid re-copying the file each 
* time you open the application. 
* 
* @return true if it exists, false if it doesn't 
*/ 
private boolean checkDataBase(){ 
     boolean checkdb = false; 
     try{ 
      String myPath = myContext.getFilesDir().getAbsolutePath().replace("files", "databases")+File.separator + DB_NAME; 
      File dbfile = new File(myPath);     
      checkdb = dbfile.exists(); 
     } 
     catch(SQLiteException e){ 
      System.out.println("Database doesn't exist"); 
     } 

     return checkdb; 
    } 

/** 
* Copies your database from your local assets-folder to the just created 
* empty database in the system folder, from where it can be accessed and 
* handled. This is done by transfering bytestream. 
* */ 
private void copyDataBase() throws IOException { 

    // Open your local db as the input stream 
    InputStream myInput = myContext.getAssets().open(DB_NAME); 

    // Path to the just created empty db 
    String outFileName = DB_PATH + DB_NAME; 

    // Open the empty db as the output stream 
    OutputStream myOutput = new FileOutputStream(outFileName); 

    // transfer bytes from the inputfile to the outputfile 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer)) > 0) { 
     myOutput.write(buffer, 0, length); 
    } 

    // Close the streams 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 
} 

public void openDataBase() throws SQLException{ 

    //Open the database 
    String myPath = DB_PATH + DB_NAME; 
    myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

    } 

@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) { 

} 
} 

我得到的錯誤,當我嘗試在這裏打開:

package com.example.APP; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 
import com.example.APP.db.DataBaseHelper; 


public class SpeakersListActivity extends Activity { 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mylayout);  

    DataBaseHelper dbHelper = new DataBaseHelper(this); 
    dbHelper.openDataBase(); 
} 
} 
+0

哎嘗試更改數據庫名app.sqlite ..我有這樣的問題,幫我 – KOTIOS

+0

我想和它沒有工作 – Goblinch

+0

[Rü數據庫複製到文件夾斷言第一? – KOTIOS

回答

5

需要先檢查數據庫文件是否存在,你是不是在這裏做

DataBaseHelper dbHelper = new DataBaseHelper(this); 
dbHelper.openDataBase(); 

你只是做一個DataBaseHelper的對象,然後調用.openDataBase()

試試這個構造函數:

public DataBaseHelper(Context context) { 
    super(context, DB_NAME, null, 1); 
    this.myContext = context; 
    try{ 
     String myPath = DB_PATH + DB_NAME; // also check the extension of you db file 
     File dbfile = new File(myPath);     
      if(dbfile.exists()); 
      Toast.makeText(context, "database exists", Toast.LENGTH_LONG).show(); 
      else 
      Toast.makeText(context, "cant find database", Toast.LENGTH_LONG).show(); 
     } 
     catch(SQLiteException e){ 
      System.out.println("Database doesn't exist"); 
     } 

} 
+0

它無法找到數據庫 – Goblinch

+0

,那麼你需要將數據庫文件從你的資產複製到應用程序目錄,就像這樣 'if(dbfile.exists()); Toast.makeText(context,「database exists」,Toast.LENGTH_LONG).show(); else copyDataBase();' 也使DB_NAME =「yourdatabasename.sqlite」; – Tarreq