3

我在我所有的应用程序中都使用 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
    }
}
4

1 回答 1

0

我会将代码放在 IntentService 中,这是一种为长时间运行的操作(尤其是保存数据的操作)实现后台线程的简单方法。使用广播 Intent 从 IntentService 向其他组件发送状态,如果需要,使用 BroadcastReceiver 接收这些 Intent。

我真的会避免在 Activity 中的 AsyncTask 中这样做;操作被杀死的风险太大。无论如何,AsyncTask 比 IntentService 复杂得多。

注意事项: IntentService 不保留任何内容,包括其类字段。为了保护自己,您可能希望将状态存储在 SharedPreferences 中。

于 2012-11-20T18:46:13.660 回答