从资产复制sqlite数据库时出错

时间:2013-03-14 05:05:49

标签: android database sqlite android-sqlite

在我的应用程序中,我必须从assets文件夹中检索sqlite数据库。但是当我这样做时,我会收到错误。

这是我用来从资产中复制数据库的编码

 public class DataBaseHelper extends SQLiteOpenHelper 
{ 
private static String TAG = "DataBaseHelper"; // Tag just for the LogCat window 
//destination path (location) of our database on device 
private static String DB_PATH = "";  
private static String DB_NAME ="(student).sqlite";// Database name 
private SQLiteDatabase mDataBase;  
private final Context mContext; 

public DataBaseHelper(Context context)  
{ 
    super(context, DB_NAME, null, 1);// 1? its Database Version 
    DB_PATH = "/data/data/" + context.getPackageName() + "/databases/"; 
    Log.i(TAG, DB_PATH);
    this.mContext = context; 
}    

public void createDataBase() throws IOException 
{ 
    //If database not exists copy it from the assets 

    boolean mDataBaseExist = checkDataBase(); 
    if(!mDataBaseExist) 
    { 
        this.getReadableDatabase(); 
        this.close(); 
        try  
        { 
            //Copy the database from assests 
            copyDataBase(); 
            Log.e(TAG, "createDatabase database created"); 
        }  
        catch (IOException mIOException)  
        { 
            throw new Error("ErrorCopyingDataBase"); 
        } 
    } 
} 
    //Check that the database exists here: /data/data/your package/databases/Da Name 
    private boolean checkDataBase() 
    { 
        File dbFile = new File(DB_PATH + DB_NAME); 
        //Log.v("dbFile", dbFile + "   "+ dbFile.exists()); 
        return dbFile.exists(); 
    } 

    //Copy the database from assets 
    private void copyDataBase() throws IOException 
    { 
        InputStream mInput = mContext.getAssets().open(DB_NAME); 
        String outFileName = DB_PATH + DB_NAME; 
        OutputStream mOutput = new FileOutputStream(outFileName); 
        byte[] mBuffer = new byte[1024]; 
        int mLength; 
        while ((mLength = mInput.read(mBuffer))>0) 
        { 
            mOutput.write(mBuffer, 0, mLength); 
        } 
        mOutput.flush(); 
        mOutput.close(); 
        mInput.close(); 
    } 

    //Open the database, so we can query it 
    public boolean openDataBase() throws SQLException 
    { 
        String mPath = DB_PATH + DB_NAME; 
        //Log.v("mPath", mPath); 
        mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY); 
        //mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS); 
        return mDataBase != null; 
    } 

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

    @Override
    public void onCreate(SQLiteDatabase arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    } 

} 

调用数据库编码

public class TestAdapter {
protected static final String TAG = "DataAdapter";

private Context mContext;
public static SQLiteDatabase mDb;
private DataBaseHelper mDbHelper;
public static TestAdapter instance;

public TestAdapter(Context context) {
    this.mContext = context;
    mDbHelper = new DataBaseHelper(mContext);
    createDatabase();
    open();
}

public static TestAdapter getTestAdaptor(Context context) {
    if (instance == null) {
        instance = new TestAdapter(context);
        // createDatabase();
        // open();
    }
    return instance;
}

private void createDatabase() throws SQLException {
    try {
        mDbHelper.createDataBase();
    } catch (IOException mIOException) {
        Log.e(TAG, mIOException.toString() + "  UnableToCreateDatabase");
        throw new Error("UnableToCreateDatabase");
    }

}

private void open() throws SQLException {
    try {
        mDbHelper.openDataBase();
        mDbHelper.close();
        mDb = mDbHelper.getReadableDatabase();
    } catch (SQLException mSQLException) {
        Log.e(TAG, "open >>" + mSQLException.toString());
        throw mSQLException;
    }
}

public void close() {
    mDbHelper.close();
}

这是我得到的错误

    03-14 10:18:03.731: E/AndroidRuntime(788): FATAL EXCEPTION: main
03-14 10:18:03.731: E/AndroidRuntime(788): java.lang.Error: ErrorCopyingDataBase
03-14 10:18:03.731: E/AndroidRuntime(788):  at com.example.voicereg.DataBaseHelper.createDataBase(DataBaseHelper.java:49)
03-14 10:18:03.731: E/AndroidRuntime(788):  at com.example.voicereg.TestAdapter.createDatabase(TestAdapter.java:38)
03-14 10:18:03.731: E/AndroidRuntime(788):  at com.example.voicereg.TestAdapter.<init>(TestAdapter.java:23)
03-14 10:18:03.731: E/AndroidRuntime(788):  at com.example.voicereg.TestAdapter.getTestAdaptor(TestAdapter.java:29)
03-14 10:18:03.731: E/AndroidRuntime(788):  at com.example.voicereg.VoiceActivity.onOptionsItemSelected(VoiceActivity.java:186)
03-14 10:18:03.731: E/AndroidRuntime(788):  at android.app.Activity.onMenuItemSelected(Activity.java:2502)
03-14 10:18:03.731: E/AndroidRuntime(788):  at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:950)
03-14 10:18:03.731: E/AndroidRuntime(788):  at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
03-14 10:18:03.731: E/AndroidRuntime(788):  at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
03-14 10:18:03.731: E/AndroidRuntime(788):  at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
03-14 10:18:03.731: E/AndroidRuntime(788):  at com.android.internal.view.menu.ListMenuPresenter.onItemClick(ListMenuPresenter.java:163)
03-14 10:18:03.731: E/AndroidRuntime(788):  at android.widget.AdapterView.performItemClick(AdapterView.java:292)
03-14 10:18:03.731: E/AndroidRuntime(788):  at android.widget.AbsListView.performItemClick(AbsListView.java:1058)
03-14 10:18:03.731: E/AndroidRuntime(788):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514)
03-14 10:18:03.731: E/AndroidRuntime(788):  at android.widget.AbsListView$1.run(AbsListView.java:3168)
03-14 10:18:03.731: E/AndroidRuntime(788):  at android.os.Handler.handleCallback(Handler.java:605)
03-14 10:18:03.731: E/AndroidRuntime(788):  at android.os.Handler.dispatchMessage(Handler.java:92)
03-14 10:18:03.731: E/AndroidRuntime(788):  at android.os.Looper.loop(Looper.java:137)
03-14 10:18:03.731: E/AndroidRuntime(788):  at android.app.ActivityThread.main(ActivityThread.java:4424)
03-14 10:18:03.731: E/AndroidRuntime(788):  at java.lang.reflect.Method.invokeNative(Native Method)
03-14 10:18:03.731: E/AndroidRuntime(788):  at java.lang.reflect.Method.invoke(Method.java:511)
03-14 10:18:03.731: E/AndroidRuntime(788):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-14 10:18:03.731: E/AndroidRuntime(788):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-14 10:18:03.731: E/AndroidRuntime(788):  at dalvik.system.NativeStart.main(Native Method)

任何人都可以帮助我在编码部分做错了什么

1 个答案:

答案 0 :(得分:0)

在createDatabase中,您关闭数据库,因此无法复制

this.getReadableDatabase(); 
    this.close();   

应该只是

this.getReadableDatabase();