我的应用程序将发送在其 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();
}
}
答案 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,这可能会为你完成大部分的脏工作。
对你的问题。如果我理解正确,我建议不要覆盖现有的数据库,因为它可能已经包含了一些用户数据吗?如果没有,只需覆盖它。如果是,您必须在首次打开时在代码中更新它。
希望有所帮助