Android sqliteOpenHelper onUpgrade用new替换db

时间:2015-01-28 23:34:11

标签: java android sqlite

我的应用程序将发送在其 assets 文件夹中使用sqlite数据库,该文件夹将在启动后复制到数据库文件夹

现在我担心的是,当我使用新的相同的 sqlite数据库发布我的应用程序的新版本时,是否会调用onUpgrade?如果是这样有助于删除当前数据库并调用oncreate(我在那里调用数据库函数的复制)?

P.s :数据库不包含任何用户数据

编辑:这是我的助手类来处理数据库

public class Helper_Db extends SQLiteOpenHelper{

    public static final String DB_NAME = "Test.sqlite";
    public static final int DB_VERSION = 3;
    private static String DB_PATH = "";
    private SQLiteDatabase _db;
    private final Context _ctx;

    public Helper_Db(Context context) {
        super(context, null, null, 1);
        DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
        _ctx = context;
}

    @Override
    public void onCreate(SQLiteDatabase db) {
        try
        {
            copyDatabase();
            Log.e("DATABASE", "Database created");
        }
        catch(IOException io)
        {
            Log.e("DATABASE", io.toString());
        }

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        _ctx.deleteDatabase(DB_NAME);
        onCreate(db);
    }       

    private void copyDatabase() throws IOException
    {
        InputStream input = _ctx.getAssets().open(DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream output = new FileOutputStream(outFileName);
        byte [] buffer = new byte [1024];
        int length;
        while((length = input.read(buffer)) > 0)
        {
            output.write(buffer, 0, length);
        }
        output.flush();
        output.close();
        input.close();
    }

    public boolean openDatabase() throws SQLException
    {
        String path = DB_PATH + DB_NAME;
        _db = SQLiteDatabase.openDatabase(path, null, 
                SQLiteDatabase.CREATE_IF_NECESSARY);
        return _db != null;
    }

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

1 个答案:

答案 0 :(得分:1)

每个数据库(SQlite)都有内部用户版本(您可以通过PRAGMA user_version获取它;)。使用

在代码中打开数据库时
SQLiteDatabase db = db = SQLiteDatabase.openDatabase(..)

然后你应该做类似

的事情
    db.beginTransaction();
    try {
        // update if needed
        if (dbVersion > db.getVersion()) {
            upgrade(db);

            // set database version to last one
            db.setVersion(dbVersion);
        }

        // end transaction
        db.setTransactionSuccessful();
    } finally {
        db.endTransaction();
    }

所以升级就在你身上。

我真的建议检查这个帮助程序类http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html,这可能会为你完成大部分的脏工作。

对你的问题。如果我理解正确,我建议不要覆盖现有的数据库,因为它可能已经包含了一些用户数据吗?如果没有,只需覆盖它。如果是,您必须在首次打开时在代码中更新它。

希望有所帮助