Имя переменной базы данных для ContentProvider - PullRequest
3 голосов
/ 01 августа 2011

Я создаю пользовательский ContentProvider в Android, все примеры, которые я нахожу, показывают, что имя базы данных жестко закодировано, например:

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.Вот как я могу получить имя переменной для базы данных с помощью SQLiteOpenHelper:

public static class ItemDatabaseHelper extends SQLiteOpenHelper {

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

Может кто-нибудь помочь мне получить имя переменной базы данных для провайдера контента?

Спасибо.

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Во-первых, позвольте мне сказать, что я просмотрел множество примеров кода ContentProvider в Интернете, и тот, который мне больше всего помог, был следующим:

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

У меня очень похожая ситуация с вашей, где я хочу иметь несколько баз данных с разными именами, содержащих данные о пробеге топлива в транспортных средствах. Каждое из имен состоит из имени транспортного средства (указанного пользователем) и текущего года, а также фиксированного текста «fuel_data», чтобы сделать имена файлов базы данных удобочитаемыми.

В отличие от всех примеров, которые я нашел, я не создаю экземпляр базы данных в методе onCreate ContentProvider. Это потому, что я еще не знаю название транспортного средства на тот момент, благодаря тому, как написан мой код (и тому факту, что ContentProviders создаются так рано в жизненном цикле Activity).

Как только я узнаю имя транспортного средства (из которого я могу легко создать имя базы данных), я вызываю простой маленький метод, который я добавил в свой класс ContentProvider. Как видите, все, что он делает - это закрывает предыдущую базу данных (если она была открыта) и открывает новую (используя имя, которое у меня теперь есть).

Я вызываю этот метод снова каждый раз, когда пользователь выбирает новое транспортное средство.

`частная статическая база данных FuelDatabase mDB = null;

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

     mDB = new FuelDatabase( context, newVehicleName + "." + getCurrentYear( context ) );
 }`
1 голос
/ 01 августа 2011

Я сам на самом деле не использовал ContentProviders, но, глядя на документы, я предполагаю, что корень проблемы в том, что вы сами не создаете экземпляр ContentProvider, а в Android, когда это необходимо для обработки запроса.

Если вы хотите, чтобы имя базы данных определялось вашим приложением во время выполнения, вы можете просто использовать общедоступную статическую переменную, которую вы устанавливаете соответствующим образом из другой части вашего приложения. Вы можете ссылаться на это из вашего ContentProvider.

В качестве альтернативы, если вы хотите, чтобы человек, который запрашивает что-то из ContentProvider, мог указать базу данных для запроса, то из документов выглядит так, как будто вы можете использовать путь URI запроса для указания базы данных. на запрос.

Структура URI запроса детализирована здесь: http://developer.android.com/guide/topics/providers/content-providers.html#urisum и далее на этой странице написано:

Авторитет - это то, что определяет провайдера, а не путь; ваш провайдер может интерпретировать часть пути URI любым способом, который вы выберете.

Так что в качестве примера я мог бы представить, что вы могли бы использовать URI вида:

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

Тогда в вашей реализации абстрактных методов ContentProvider вы могли бы проанализировать URI, чтобы определить используемую БД.

Одно слово предупреждения, хотя - если вы собираетесь использовать этот подход, то я бы предложил не использовать значение, переданное напрямую. Было бы намного лучше использовать какую-то проверку для ограниченного списка, чтобы люди не могли просто запросить любую из ваших баз данных (если они знают свое имя).

Надеюсь, это имеет смысл:)

...