2011-01-09 4 views
9

http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase%28%29 상태에서 문서 : 당신이 ContentProvider.onCreate에서 포함하여 응용 프로그램 메인 스레드에서이 방법 [getWritableDatabase]를 호출해서는 안 Android 애플리케이션에서 SQLite getWritableDatabase를 어디에서 호출해야합니까?

데이터베이스 업그레이드, 시간이 오래 걸릴 수 있습니다().

이것은 모범 사례로, getWritableDatabase를 어디에서 호출해야합니까?

아마도 데이터베이스를 준비 상태로 표시하는 콜백을 통해 응용 프로그램 실행시 한 번 호출해야한다는 생각이 들었습니다. 이 올바른지?

답변

4

작고 민첩한 데이터베이스의 경우에는별로 문제가되지 않는다고 생각합니다.

그렇지 않으면 onCreate에서 전화하여 항상 훌륭한 AsyncTask을 사용하고 싶습니다.

2

어디에서나 호출 할 수 있지만 프로세스 사용 시간 (특히 사용중인 다른 파일 시스템)을 알지 못하기 때문에 UI 스레드에서 호출하면 안됩니다. 데이터베이스가 작아야한다는 것을 알고 있더라도 파일 시스템에 대해 알지 못합니다 (한 번에 둘 이상의 작업을 수행 할 수 있습니까? 이미 1,000 개의 다른 작업이 대기 중이십니까?). AsyncTask 또는 Thread을 사용하여 getWriteableDatabase를 호출 할 수 있습니다.

0

오픈 도우미 프레임 워크의 의도 된 사용은 활동 시작시 db를 열고 활동이 삭제 될 때 닫는 것 같습니다. 에서 onCreate() 내에서 AsyncTask를에서

은 ...

new StartupTask().execute(); 

AsyncTask를 Thread.sleep를() 아래 당신이 그 일을 볼 수 있도록 대화 상자를 표시 할 수있는 충분한 시간을 제공하는 것입니다. 연주를 마쳤을 때 분명히 그것을 꺼내십시오.)들의 OnDestroy()에서

private class StartupTask extends AsyncTask 
{ 

    private ProgressDialog progressDialog; 

    @Override 
    protected Object doInBackground(final Object... objects) 
    { 
     openHelperRef.getWritableDatabase(); 
     try 
     { 
      Thread.sleep(5000); 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
     runOnUiThread(new Runnable() 
     { 
      public void run() 
      { 
       progressDialog = ProgressDialog.show(
        MyActivity.this, "Title", 
        "Opening/Upgrading the database, please wait", true); 
      } 
     }); 
    } 

    @Override 
    protected void onPostExecute(Object object) 
    { 
     super.onPostExecute(object); 
     progressDialog.dismiss(); 
    } 

} 

... openHelper.close();

관련 문제