2012-09-29 3 views
0

나는 안드로이드와 자바로 무언가를 성취 할 수있는 제안이 필요하다. 50 개 이상의 활동이있는 큰 프로젝트가 있고 두 개의 다른 데이터베이스 클래스를 사용하여 sqlite 문을 쿼리하고 내 시스템과 사용자 데이터베이스에서 정보를 검색합니다.안드로이드 데이터베이스 인스턴스 클래스

SystemDatabaseHelper dbHelper = new SystemDatabaseHelper(this, null, 1); 
dbHelper.initialize(this); 

내가 활동에 그 일을하고 지난 몇 일 '비에 Context을 제공에 대한 안드로이드 전체 정보에서 메모리 누수에 대한 많은 읽기 : 여기 내 데이터베이스를 사용하고 초기화하고 방법 예입니다 - 액티비티 클래스와 이로 인해 발생할 수있는 누출. 내 질문은 일부 클래스를 만들고 주 활동에서만 초기화하는 것이 가장 좋습니다. 몇 번이고 다시 초기화하지 않고 다른 모든 활동에서 사용하는 것이 가장 좋습니다.

이 목표를 달성하는 가장 좋은 방법은 ... 아이디어가 있지만 의견이나 권장 사항을 듣고 싶습니다.

답변

2

싱글 도우미를 찾고있는 데이터베이스 도우미 클래스를 한 번만 초기화하려는 경우 ?? 여기 당신이 처음 ContactDBHelper.getInstance();를 호출하는 경우가

public class ContactDBHelper extends SQLiteOpenHelper { 

    private ContactDBHelper(Context context, String name, 
      CursorFactory factory, int version) { 
     super(context, name, factory, version); 

    } 

    private static ContactDBHelper mInstance; 

    public static synchronized ContactDBHelper getInstance() { 

     if (mInstance == null) { 
      mInstance = new ContactDBHelper(Util.getApplicationContext(), 
        ContactDB.DB_NAME, null, ContactDB.DB_VERSION); 
     } 
     return mInstance; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(ContactDB.Contact.CREATE_STMT); 
     db.execSQL(ContactDB.Contact.CREATE_PHONE_NUMBER_INDEX); 
     db.execSQL(ContactDB.Contact.CREATE_REVERSE_PHONE_NUMBER_INDEX); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected Object clone() throws CloneNotSupportedException { 

     throw new CloneNotSupportedException(); 
    } 

} 

, 그 인스턴스를 초기화 할 수있는 방법을 예입니다, 모든 응용 프로그램 구성 요소 또는 호출됩니다 어떤 방법 그 후, 그것은 습관이 싱글을 반환합니다 초기화 초기화 된 인스턴스. 참고 : Util.getApplicationContext의 경우 주 활동에 설정된 응용 프로그램 컨텍스트를 반환하는 정적 도우미 메서드입니다.

메모리 누수를 들어, 피할 수 또는 여기

WeakReference 또는 SoftRerference를 사용에서 응용 프로그램을 보호 당신은 응용 프로그램 클래스를 확장하고 하나의 글로벌 참조를 사용할 수있는 백분율 클래스

public class Util { 

    private static WeakReference<Context> applicationContext; 

    public static Context getApplicationContext() { 
     return applicationContext.get(); 
    } 

    public static void setApplicationContext(Context context) { 
     applicationContext = new WeakReference<Context>(context); 
    } 
} 
+0

사실 나는 그런 것을하려고 생각했지만 WeakReference를 사용하지는 않았습니다. 정말 도움이되었습니다, 많이 감사합니다! – hardartcore

1

입니다. 이것은 또한 Activity 컨텍스트를 사용하지 않는 이점이 있습니다.

public class NameOfApp extends Application { 

    public static SQLiteDatabase db; 

    @Override 
    public void onCreate() { 

      super.onCreate(); 

      try{ 

       // this will create the database if required (e.g. new install or db deleted) 
       db=new Database(this.getBaseContext()).getWritableDatabase();   

      } catch (Exception e) { 

       // TODO add alert and quit 
       Log.e(TAG,"Error creating DB:" + e.getMessage()); 
       Toast.makeText(getApplicationContext(), "Error creating DB:" + e.getMessage(), Toast.LENGTH_LONG).show(); 

     } 

    } // onCreate 

    @Override 
    public void onTerminate(){ 
     Log.d(TAG, "Application.onTerminate() database closed"); 
     super.onTerminate(); 
     savePreferences(); 
     db.close(); 
    } 

    public void closeDB(){ 
      db.close(); 
      Log.d(TAG,"Database closed on request"); 
    } 

    protected SQLiteDatabase getwritableDatabase(){ 
     return db; 
    } 

} 

MyAppName.getWritableDatabase()를 사용하십시오.

+0

onTerminate()을 호출해서는 안됩니다. 실제로 응용 프로그램의 프로세스를 종료 할 때 모든 시스템 리소스를 닫는 android System에서 릴레이 할 수 있습니다. http://developer.android.com/reference/android/app/Application.html#onTerminate() – confucius

+0

onTerminate()에 의존하지 않습니다. 그것이 closeDB()가있는 이유입니다. :) – Simon