2011-08-01 2 views
2

을 위해 내가 데이터베이스 이름을 표시 찾을 수 모든 예제는 다음과 같이 인스턴스화, 하드 코딩 된 안드로이드에서 사용자 정의 컨텐트 프로를 만드는 오전 :변수 데이터베이스 이름은 컨텐트 프로

public class ItemProvider extends ContentProvider { 

    private static String DATABASE_NAME = "xyz"; 

    public static class ItemDatabaseHelper extends SQLiteOpenHelper { 

    ItemDatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 

    } 

내가 뭘 원하는 것은에 대한 변수를 사용하다 런타임에 데이터베이스 이름, 나는 클래스에서 데이터베이스 이름을 하드 코드 싶지 않아. ContentProvider 클래스를 사용하여이 작업을 수행하는 예제를 찾으려고 시도했으며 설명서도 살펴 보았습니다. ContentProvider 클래스를 흘려서 매개 변수로 생성자에 데이터베이스 이름을 전달할 수 있기 때문에 SQLiteOpenHelper 클래스를 사용하면이 작업을 수행 할 수 있습니다. 그러나 ContentProvider가 가능한지 알아낼 수는 없습니다.

public static class ItemDatabaseHelper extends SQLiteOpenHelper { 

    ItemDatabaseHelper(Context context, String dbname) { 
     super(context, dbname, null, DATABASE_VERSION); 
    } 

사람이 나 콘텐츠 제공자에 대한 변수 데이터베이스 이름을 얻을 수 있도록 수 : 나는 SQLiteOpenHelper를 사용하여 데이터베이스에 대한 변수 이름을 얻는 방법은 다음이다?

감사합니다.

답변

1

저는 ContentProviders를 직접 사용하지 않았지만 문제의 근본 원인을 추측하고 있습니다. ContentProvider를 직접 인스턴스화하지 않지만 Android가 요청을 처리 할 필요가있을 때 수행한다는 것입니다. .

응용 프로그램에서 런타임에 데이터베이스 이름을 정의하려면 응용 프로그램의 다른 부분에서 적절하게 설정 한 공용 정적 변수를 사용하면됩니다. 그런 다음 ContentProvider에서이를 참조 할 수 있습니다.

ContentProvider에서 요청한 사람이 쿼리 할 데이터베이스를 지정할 수있게하려면 요청 URI의 경로를 사용하여 문서를 지정할 수있는 것처럼 보입니다. 질문.

요청 URI의 구조는 여기에 자세히 설명되어 있습니다 : http://developer.android.com/guide/topics/providers/content-providers.html#urisum하고 말한다이 페이지를 더욱 :

권위 공급자가 아닌 경로를 식별하는 것입니다; 귀하의 제공 업체는 귀하가 선택한 방식으로 URI의 경로 부분을 해석 할 수 있습니다.

content://com.example.yourprovider/DB_REF/ID

그런 ContentProvider의 추상 메소드의 구현에 당신이를 결정하기 위해 URI를 구문 분석 할 수 :

그래서 예를 들어, 당신이 형식의 URI를 사용할 수 상상 사용할 DB.

경고의 한 단어 -이 방법을 사용하려는 경우 직접 전달 된 값을 사용하지 않을 것을 제안합니다. 유한 목록에 대해 일종의 유효성 검사를 사용하는 것이 훨씬 더 좋으므로 사람들은 자신의 이름을 아는 경우 데이터베이스를 쿼리 할 수 ​​없습니다.수

희망 의미 :

+0

답장을 보내 주셔서 감사합니다. 당신은 ContentProvider가 인스턴스화되는 방법에 대해 정확합니다. 그 모든 "자동"은 SQLiteOpenHelper 레벨에서 제어 할 수없는 이유입니다. 두 번째 제안은 장치에서 여러 개의 동일하게 구조화 된 데이터베이스가 있어야하고 사용자가 런타임에서 전환 할 수 있어야하고 사전에 호출 될 내용을 모르기 때문에 두 번째 제안이 효과가 있다고 생각하지 않습니다. 첫 번째 제안은 좋게 들리지만 구현하려고 시도했지만 자바 기술은 그렇지 않습니다. 어떻게 할 것입니까? – stevekiwi

1

첫째, 내가 나에게 도움이 내가 컨텐트 프로의 웹 코드, 그리고 결국 하나의 예를 많이 봤는데 가정 해 봅시다 가장이 하나 :

http://mobile.tutsplus.com/tutorials/android/android-sdk_content-providers/

가 나는 차량 연료 주행 거리 데이터를 포함한 여러 다른 이름의 데이터베이스를 갖고 싶어 당신에게 매우 비슷한 상황이있다. 각 이름은 데이터베이스 이름을 사람이 읽을 수 있도록하기 위해 차량 이름 (사용자가 지정)과 현재 연도 및 고정 텍스트 "fuel_data"로 구성됩니다.

내가 발견 한 모든 예제와 달리 ContentProvider의 onCreate 메소드에서 데이터베이스의 인스턴스를 만들지 않습니다. 이는 내 코드가 작성된 방식 (그리고 ContentProviders가 Activity 라이프 사이클 초기에 인스턴스화된다는 사실) 덕분에 그 시점에서 차량 이름을 아직 모르기 때문입니다.

일단 차량 이름을 알고 나면 (데이터베이스 이름을 쉽게 만들 수 있음) 일단 ContentProvider 클래스에 추가 한 간단한 메소드를 호출합니다. 보시다시피 이전 데이터베이스 (열려있는 경우)를 닫고 새 데이터베이스를 엽니 다 (지금 사용할 수있는 이름 사용).

사용자가 새 차량을 선택할 때마다 다시이 메서드를 호출합니다.

`private static FuelDatabase mDB = null;

public static void switchDatabases(Context context, String newVehicleName) 
{ 
    if (mDB != null) 
    { 
    mbB.close(); 
    } 

    mDB = new FuelDatabase(context, newVehicleName + "." + getCurrentYear(context)); 
}` 
관련 문제