0

我正在尝试使 dataAdapter 扩展 SQLiteOpenHelper。下面是代码:

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

import android.annotation.SuppressLint;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import com.muoiot.enlistening.idefined.*;
import com.muoiot.enlistening.utilities.MsgUtils;

public class DbAdapter extends SQLiteOpenHelper implements DB_INFO, DB_USER, DB_QUESTION {

    public static String defaultDbPath = "";
    protected SQLiteDatabase databaseControl;
    private Context context = null;

    public DbAdapter(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
        this.context = context;
        defaultDbPath = "/data/data/" + context.getApplicationContext().getPackageName() + "/databases/";
    }

    /***********************************************************************************/
    // This function auto call at the first time when the database was not found.
    /***********************************************************************************/   
    @Override
    public void onCreate(SQLiteDatabase db) {

        MsgUtils.DB("Don't have database, need to copy from asset");
        try {
            copyDataBase();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    /***********************************************************************************/
    // This function auto call when the database has been opened.
    /***********************************************************************************/   
    @Override
    public void onOpen(SQLiteDatabase db){
        MsgUtils.DB(" AAAAAAAAAAAAAAAAAAAAAAAAA has been opened!!!");
    }

    /***********************************************************************************/
    // Copy database
    /***********************************************************************************/       
    private void copyDataBase() throws IOException {

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

        // Path to the just created empty db
        String outFileName = defaultDbPath + 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();

    }

    /***********************************************************************************/
    // Open and close database 
    /***********************************************************************************/   
    public void openDatabase(){
        databaseControl = this.getWritableDatabase();
    }

    public void closeDatabase(){
        this.getWritableDatabase().close();
    }

}

而且,现在我遇到了 copyDataBase 函数的问题。我总是得到一个没有任何表的数据库。(我的手机已经root了,所以我从data/data//databases复制回数据库来查看)。

我在这里错了什么?任何人都可以帮我一把吗?

4

1 回答 1

0

AFAIK,函数 onCreate() 仅在我们第一次访问数据库并且数据库不存在时调用。所以我认为在这里放一些代码来复制数据库是可以的。但是看起来有些东西……我现在还不清楚。

当我尝试将我的代码放入此函数(从数据资产复制数据库)时,创建的数据库与我的大小相同,但没有表。

我只是按照Database not copying from assets中提到的解决方案。它现在可以工作了!我只看到一个不同的东西,他在构造函数中调用复制数据库而不是 OnCreate,他首先调用 getReadableDatabase()。

无论如何,我必须完成我已经开始的事情,然后回到这个话题,因为我对答案不满意。如果有人有同样的问题,请尝试使用数据库中的解决方案,而不是从资产中复制来解决。如果你能弄清楚我错了什么,请帮助我!

非常感谢你们!

于 2013-07-08T14:25:59.887 回答