gpt4 book ai didi

java - Android sqliteOpenHelper onUpgrade 用新数据库替换数据库

转载 作者:行者123 更新时间:2023-12-01 11:58:09 25 4
gpt4 key购买 nike

我的应用程序将在其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();
}
}

最佳答案

每个数据库(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 ,这可能会为您完成大部分脏活。

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

希望对你有帮助

关于java - Android sqliteOpenHelper onUpgrade 用新数据库替换数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28204454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com