SQLite数据库没有得到更新,除非我手动卸载然后安装新的apk

时间:2013-12-20 17:56:07

标签: android database sqlite

这是我的数据库助手类:

package tabswipe;


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.SQLiteOpenHelper;
import android.util.Log;

public class ExternalDbOpenHelper extends SQLiteOpenHelper {

    public static String DB_PATH;
    public static String DB_NAME;
    public SQLiteDatabase database;
    public final Context context;

    public SQLiteDatabase getDb() {
        return database;
    }

    public ExternalDbOpenHelper(Context context, String databaseName) {
        super(context, databaseName, null, 93);
        this.context = context;
        String packageName = context.getPackageName();
        DB_PATH = String.format("//data//data//%s//databases//", packageName);
        DB_NAME = databaseName;
        openDataBase();
    }

    public void createDataBase() {
        boolean dbExist = checkDataBase();
        if (!dbExist) {
            this.getReadableDatabase();
            try {
                copyDataBase();
            } catch (IOException e) {
                Log.e(this.getClass().toString(), "Copying error");
                throw new Error("Error copying database!");
            }
        } else {
            Log.i(this.getClass().toString(), "Database already exists");
        }
    }
    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(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_READWRITE);
        }
        return database;
    }
    @Override
    public synchronized void close() {
        if (database != null) {
            database.close();
        }
        super.close();
    }


    @Override
    public void onCreate(SQLiteDatabase db) {

        //createDataBase();
        openDataBase();

    }



    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // on upgrade drop older tables
        db.execSQL("DROP TABLE IF EXISTS perception_database");
        // create new tables
        onCreate(db);

    }
}

我不确定我应该在OnCreate和onUpgrade函数中添加什么内容,以便在不先清除数据和卸载的情况下更新数据库。

我正在使用预先填充的sqlite数据库

数据库名称为umangdb.db

它包含许多表,其中一个是perception_database,我试图删除并重新创建。

我不介意删除并重新创建所有表,因为数据库非常小。 我无法完全理解我从朋友那里获得的这个数据库助手类。

3 个答案:

答案 0 :(得分:3)

SQLiteOpenHelper的构造函数的一个参数是DB的当前版本:see here。每次部署需要进行数据库升级的应用程序的新版本时,都会增加版本,从而调用OnUpgrade方法,在其中处理对数据库所做的更改。

答案 1 :(得分:0)

在onUpgrade功能中,传递更高版本号

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}

如果您不需要在测试期间保存旧表中的信息,则可以删除故事并重新创建新表。

 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // on upgrade drop older tables
        db.execSQL("DROP TABLE IF EXISTS " + tablename);

        // create new tables
        onCreate(db);
    }

编辑: 您可以在ExternalDbOpenHelper类

中创建以下函数
public void onDelete(Context context){
     context.deleteDatabase(DATABASE_NAME);
}
在onCreate函数中

,像这样调用

db = new ExternalDbOpenHelper(getApplicationContext());
    db.onDelete(getApplicationContext());

我理解你想要在测试期间破坏并重建数据库。

答案 2 :(得分:0)

我最近发布了一个关于使用SqlOpenHelper更新数据库的简短教程。也许它可以为您提供一些指导,因为我看到的大多数其他教程只是删除并重新创建数据库,而不是使用完整的数据进行升级。

http://android.kuffs.co.uk/2013/12/how-to-handle-database-creation-and.html