2016-07-24 4 views
1

현재 SQLite 데이터베이스와 많은 통신을 수행하는 안드로이드 프로젝트를 수행 중이다. 또한 MVP 프레임 워크를 앱 내에 구현하려고합니다.안드로이드에서 SQLite 싱글 톤 인스턴스와 그 컨텍스트 의존성 처리하기

현재 싱글턴 인스턴스의 구현은 다음과 유사합니다. (이 게시물에서 촬영 : https://github.com/codepath/android_guides/wiki/Local-Databases-with-SQLiteOpenHelper)을 위의 기존 코드와

public class PostsDatabaseHelper extends SQLiteOpenHelper { 
    private static PostsDatabaseHelper sInstance; 

    public static synchronized PostsDatabaseHelper getInstance(Context context) { 
    if (sInstance == null) { 
     sInstance = new PostsDatabaseHelper(context.getApplicationContext()); 
    } 
    return sInstance; 
    } 

    private PostsDatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
} 

, 나는 그들 각각의 활동/조각에서 전달 된 Context 객체로 전달 여러 발표자 클래스의 getInstance 메소드를 호출합니다. Context 객체는 여러 클래스에 전달 될 수 있습니다.

위의 코드 대신, 응용 프로그램의 시작 부분에서 databaseHelper를 한 번만 인스턴스화하고 모든 참조가 컨텍스트 종속성없이 getInstance 메서드의 변형을 가리킬 것이라고 생각했습니다.

편집 : 내 주된 목표는 Presenter 클래스에서 Context 객체의 존재를 가능한 한 많이 제거하여 코드를보다 깨끗하게 만드는 것입니다. getInstance에 대한 모든 호출은 동일한 유형의 Context (응용 프로그램의 컨텍스트가 아니라 Activity 관련 컨텍스트)를 제공/주입하기 때문에 Context 객체를 인수로 지정할 필요가 없습니다.

public class PostsDatabaseHelper extends SQLiteOpenHelper { 
    private static PostsDatabaseHelper sInstance; 

    // called by all other classes 
    public static synchronized PostsDatabaseHelper getInstance() { 
    if (sInstance == null) { 
     //throw error 
    } 
    return sInstance; 
    } 

    // only called once at the start of the Application 
    public static void instantiateInstance(Context context){ 
    sInstance = new PostsDatabaseHelper(context.getApplicationContext()); 
    } 

    private PostsDatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
} 

내가 알고 싶은 것은 이러한 접근 방식에는 단점이 있습니까? 감사!

답변

2

정적 초기화를 위해 지연 초기화를 수행하고 있습니다.

일반적으로 지연 초기화는 응용 프로그램 수명 동안 초기화 비용을 상각합니다. 이 경우 두 가지 이유로 덜 중요해 보입니다.

  1. 이 DB가 거의 필요할 것입니다. 초기화를 끄면 전혀하지 않아도 될 것 같지 않습니다.
  2. 안드로이드 프레임 워크는 DBHelper 생성자가 UI 스레드에서 실행될 수 있음을 보증합니다. 시간이 걸리는 것은 아닙니다. 시간이 걸리는 것은 getWriteableDatabase에 대한 첫 번째 호출입니다. 도우미의 게으른 생성은 거의 아무것도 수행하지 않습니다.
당신은이 같은 응용 프로그램에서 DB를 초기화하여, 코드가 더 적은 복잡하게 고려해 볼 수 있습니다

: Dagger2 같은,에, IOC는 프레임 워크를 사용, 더 나은 아직,

public class DBDrivenApp extends Application implements DBProvider { 

    // ... 

    private PostsDatabaseHelper db; 

    // ... 

    @Override 
    public void onCreate() { 
    super.onCreate(); 
    db = new PostsDatabaseHelper(this); 
    } 

    @Override 
    public PostsDatabaseHelper getDB() { return db; } 

    // ... 
} 

... 그리고 데이터베이스 인스턴스를 삽입하여 테스트 할 때 조롱 할 수 있습니다.

+0

안녕하세요 블레이크, 자세한 답변을 주셔서 감사합니다. 게으른 초기화를 사용하면 초기화 비용이 거의 들지 않는다는 점에 동의합니다. 나의 주요 목표는 Presenter 클래스에서 'Context'객체의 존재를 줄여 코드를보다 깨끗하게 만드는 것입니다. 게다가 getInstance 메소드에 대한 모든 호출은 실제로 동일한 응용 프로그램 Context를 제공하기 때문에 Context 객체가 후속 호출의 인수로 전혀 전달되지 않아야하는 이유는 알 수 없습니다. 건네받은 Context 객체가 Activity 고유의 컨텍스트 인 경우, 그것을 인수로서 가지는 것이 타당합니다. –

+0

예. 나는 그 모든 것에 동의한다고 생각합니다. 필자가 제안한 코드를 사용하는 경우 DBProvider를 발표자 (상황에 따라 컨텍스트 및 응용 프로그램)에 전달해야합니다. 발표자가 DB에서 물건을 가져와야하는 경우 합리적인 것 같습니다 ... –

+0

...또는 btw, 너에게 너무 오래된 학교라면 이벤트 버스에서 듣는 것에 DBHelper를 배치하여 iOS 스타일을 추가로 할 수 있습니다. 그렇다면 DBProvider를 Presenter에 전달할 필요조차 없습니다. –