4

db.sqlite在文件夹中有我的文件,Asset当我尝试打开它时出现此错误:

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();
}
}
4

1 回答 1

5

you need to check the existence of the database file first which you are not doing here

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

you are simply making an object of DataBaseHelper and then calling .openDataBase()

try this constructor :

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");
        }

}
于 2013-08-07T12:10:25.740 回答