2012-11-20 4 views
3

나는 모든 응용 프로그램에서 조용하게 SQLiteOpenHelper (아래 참조)를 사용하고 있습니다. 기존 데이터베이스에 대한 많은 업그레이드가 수년 동안 성공적으로 끝났습니다.스레드에서 SQLite를 어떻게 업그레이드해야합니까?

이번에는 내 앱 중 하나에서 데이터베이스를 업그레이드해야하며이 단계는 얼마 동안 지속될 것입니다. 그래서 나는이 업그레이드 문을 그들 자신의 스레드에 넣어야한다.

가장 적합한 곳은 무엇입니까?

어떤 도움

높게 평가된다.

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 
    } 
} 
+0

'onUpgrade' 메서드가 (스레드에서) 호출되도록 트리거하는 데이터베이스를 여는 스레드를 시작할 수 있습니다 ('getWritableDatabase' 호출로 충분합니다). –

+0

감사합니다. 그것을 시작하는 가장 좋은 방법은 무엇입니까 (응용 프로그램을 확장합니까?) 및 업 그레 이드에서 실행되는 스레드가 끝날 때까지 응용 프로그램을 일시 중지하는 방법은 무엇입니까? –

답변

0

나는 특히, 장기 실행 작업에 대한 데이터를 저장 하나를 백그라운드 스레드를 구현하는 쉬운 방법 인 IntentService에 코드를 넣어 것입니다. IntentService에서 다른 구성 요소로 상태를 보내려면 Broadcast Intent를 사용하고, 필요하면 BroadcastReceiver가이 Intent를 수신하도록 사용하십시오.

Activity 내 AsyncTask에서이 작업을 수행하지 않는 것이 좋습니다. 그 수술이 죽을 위험이 너무 커. 어쨌든 AsyncTask는 IntentService보다 훨씬 복잡합니다.

하나의 메모 : IntentService는 클래스 필드를 포함하여 아무 것도 유지하지 않습니다. 자신을 보호하기 위해 SharedPreferences에 상태를 저장할 수 있습니다.

+0

감사합니다. IntentService는 좋은 생각입니다. 내 응용 프로그램에서 AsyncTasks를 많이 사용하고 있습니다. 따라서이 옵션도 있습니다. 하지만 어떻게 시작하겠습니까? (응용 프로그램을 확장합니까?) onUpgrade가있는 스레드가 끝날 때까지 응용 프로그램을 일시 중지하는 방법은 무엇입니까? –

관련 문제