永远不会调用数据库onUpgrade方法

时间:2013-01-15 06:48:53

标签: java android sqlite

我正在尝试将我的数据库从版本1升级到版本2.我正在分配DATABASE_VERSION = 2(第一个版本也已分配),但onUpgrade从未调用过。 可能是代码中有一个明显的错误,但我看不到它,因为我试图解决这个问题很长一段时间。

以下是数据库助手类的代码:

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 2;
    public static String DB_PATH;
    public static String DB_NAME = "db.sqlite3";
    public SQLiteDatabase database;
    public final Context context;

    public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, DATABASE_VERSION);
        this.context = context;

        File direct = new File(Environment.getExternalStorageDirectory()
                + "/.test");
        if (!direct.exists()) {
            if (direct.mkdir())
                ;
        }
        DB_PATH = Environment.getExternalStorageDirectory().getPath()
                + "/.test/";
    }

    public void createDataBase() {
        boolean dbExist = checkDataBase();
        if (!dbExist) {
            try {
                copyDataBase();
            } catch (IOException e) {
                Log.e(this.getClass().toString(), "Copying error");
                throw new Error("Error copying database!");
            }
        }
    }

    private boolean checkDataBase() {
        SQLiteDatabase checkDb = null;
        try {
            String path = DB_PATH + DB_NAME;
            checkDb = SQLiteDatabase.openDatabase(path, null,
                    SQLiteDatabase.OPEN_READONLY);
        } catch (SQLException e) {
            Log.e(this.getClass().toString(), "Error while checking db");
        }
        if (checkDb != null) {
            checkDb.close();
        }
        return checkDb != null;
    }

    private void copyDataBase() throws IOException {
        InputStream externalDbStream = context.getAssets().open(
                "databases/" + DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream localDbStream = new FileOutputStream(outFileName);

        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = externalDbStream.read(buffer)) > 0) {
            localDbStream.write(buffer, 0, bytesRead);
        }
        localDbStream.close();
        externalDbStream.close();
    }

    public SQLiteDatabase openDataBase() throws SQLException {
        String path = DB_PATH + DB_NAME;
        if (database == null) {
            createDataBase();
            database = SQLiteDatabase.openDatabase(path, null,
                    SQLiteDatabase.OPEN_READONLY);
        }
        return database;
    }

    // some unimportant methods

@Override
    public void onCreate(SQLiteDatabase db) {
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w("myLogs", " --- onUpgrade database --- ");
    }

在Activity中我像这样调用数据库:

DatabaseHelper dbOpenHelper = new DatabaseHelper(this);
SQLiteDatabase database = dbOpenHelper.openDataBase();

我的错误在哪里? 求助。

UPD: database.getVersion()返回0


更新了openDataBase()方法(它正在运行):

public SQLiteDatabase openDataBase() throws SQLException {
    String path = DB_PATH + DB_NAME;
    if (database == null) {
        createDataBase();
        database = SQLiteDatabase.openDatabase(path, null,
            SQLiteDatabase.OPEN_READWRITE);
        this.getWritableDatabase();
    }
    return database;
}

2 个答案:

答案 0 :(得分:3)

本地数据库版本将始终为0,并且不会调用onUpgrade,因为您从未调用getWritableDatabase/getReadableDatabase,这将导致版本崩溃并返回本地数据库。

所以你需要:

  1. 在你的contructor / oncreate中调用getReadableDatabase();,只是为了触发进程,以防db版本被更改为
  2. 手动检查SD卡版本,db.getVersion();与当前版本进行比较 - DATABASE_VERSION。并做你需要做的事 - 升级或降级。

答案 1 :(得分:0)

代码中没有onCreate方法。这意味着,您的数据库从未创建过。

此外,仅在调用以下任何方法后调用onCreateonUpgrade方法:database.getReadableDatabase()database.getWritableDatabase(),调用执行创建数据库。

UPD:试试这个:

DatabaseHelper dbOpenHelper = new DatabaseHelper(this);

SQLiteDatabase database = dbOpenHelper.openDataBase();

SQLiteDatabase database = dbOpenHelper.getWritableDatabase();
Log.w(database.getVersion());