3

私はすべてのアプリで SQLiteOpenHelper (以下に示す) を使用しており、静かに満足しています。長年にわたり、既存のデータベースへの多くのアップグレードが成功裏に終了しました。

今回は、アプリの 1 つでデータベースをアップグレードする必要があり、この手順はしばらく続きます。したがって、これらのアップグレード ステートメントを独自のスレッドに配置する必要があります。

そうするのに最適な場所はどこですか?

どんな助けでも大歓迎です。

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 に入れます。これは、長時間実行される操作、特にデータを保存する操作のバックグラウンド スレッドを実装する簡単な方法です。必要に応じて、ブロードキャスト インテントを使用して IntentService から他のコンポーネントにステータスを送信し、BroadcastReceiver を使用してこれらのインテントを受信します。

アクティビティ内の AsyncTask でこれを行うことは本当に避けたいと思います。操作が中止されるリスクが大きすぎます。とにかく、AsyncTask は IntentService よりもはるかに複雑です。

1 つの注意: IntentService は、そのクラス フィールドを含め、何も保持しません。自分自身を守るために、状態を SharedPreferences に保存することをお勧めします。

于 2012-11-20T18:46:13.660 に答える