我在我所有的应用程序中都在使用SQLiteOpenHelper (如下所示),非常愉快。多年来,许多对现有数据库的升级都以成功告终。
这一次,我需要在我的一个应用程序中升级数据库,这一步将持续一段时间。所以我需要把这些升级语句放在它们自己的线程中。
最好的地方是什么?
任何帮助都是非常感谢的。
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
protected static final Object lock = new Object();
private static final int DATABASE_NAME = "mydatabase.db";
private static final int DATABASE_VERSION = 3;
private Context context;
private SQLiteDatabase database;
public MySQLiteOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase database) {
synchronized (lock) {
this.database = database;
// Create database statements
}
}
@Override
public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
synchronized (lock) {
this.database = database;
switch (newVersion) {
case DATABASE_VERSION:
switch (oldVersion) {
case 1:
upgradeFrom1To2();
case 2:
upgradeFrom2To3();
}
break;
}
}
}
private void upgradeFrom1To2() {
// Upgrade database statements
}
private void upgradeFrom2To3() {
// Upgrade database statements
}
}发布于 2012-11-21 02:46:14
我将代码放在IntentService中,这是为长时间运行的操作实现后台线程的一种简单方法,尤其是保存数据的操作。如果需要,使用广播意图将状态从IntentService发送到其他组件,并使用BroadcastReceiver接收这些意图。
我真的会避免在活动中用AsyncTask来做这件事;有太多的风险会导致操作被终止。无论如何,AsyncTask比IntentService复杂得多。
注意: IntentService不持久化任何内容,包括它的类字段。为了保护您自己,您可能希望将状态存储在SharedPreferences中。
https://stackoverflow.com/questions/13474132
复制相似问题