Как организовать код доступа к базе данных в проекте Android? - PullRequest
3 голосов
/ 17 мая 2010

Я создал ContentProvider для своей основной таблицы Sqlite, в значительной степени следуя примеру NotePad из SDK (хотя я не уверен, буду ли я когда-либо предоставлять свои данные другим приложениям). Однако мне нужно создать множество других нетривиальных запросов для этой и других таблиц и представлений. Хорошим примером могут служить запросы для извлечения некоторой статистики из базовых данных, средних значений, итогов и т. Д.

Так что же является лучшим местом для этого кода в проекте Android? Как это должно быть связано и связано с доступом к данным на основе Uri, предоставляемым провайдером? Есть хорошие примеры?

Ответы [ 2 ]

3 голосов
/ 18 мая 2010

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

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

Если вы хотите избежать модели провайдера, то реализация класса DA довольно проста. Обычно SQLiteOpenHelper создается как внутренний класс для класса DA (открытый помощник также обеспечивает базовую поддержку версий), и экземпляр этого класса используется для создания соединений с базой данных в функциях DA. Есть много примеров в исходном коде Android. Посмотрите на любую из реализаций провайдера, с MediaProvider.java , вероятно, наиболее релевантной, поскольку она использует довольно сложные поиски провайдера. Например, из исходного кода, который не является поставщиком контента, см. DbSSLSessionCache.java

1 голос
/ 17 мая 2010

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

Я рекомендую написать класс, единственной задачей которого является обновление / запрос базы данных. Затем из других ваших классов / занятий вы можете создать экземпляр этого класса доступа к БД для получения или размещения данных.

Вы можете одновременно запустить несколько экземпляров вашего класса БД.

Edit: Примеры фрагментов кода (я взял определение класса и пару методов из моего рабочего кода) Это было мое первое приложение, поэтому оно не идеально, но оно работает:

public class VoyagerDB extends SQLiteOpenHelper {
    @Override
    public void onCreate(SQLiteDatabase db) {
            boolean ret = false;

            // build out the schema
            ret = populateSchema(db);

    }


    /**
     * Returns information from a given obdRequest record.
     * @param requestID
     * @return
     */
    public Cursor getRequestInfo (String requestID) {

            Cursor c = null;

            String sql = "SELECT id _id, active,request,formula, description,frequency,minValue,maxValue,numDataBytes " +
                            "FROM obdRequest " +
                            "WHERE ID=" + requestID;

            c = localDBRW.rawQuery(sql, null);

            return c;
    }


    /**
     * If the given settings key exists in the DB, return its record ID. Otherwise return blank.
     * @param key
     * @return
     */
    public String settingsKeyExists (String key) {
            String recordID = "";
            Cursor c = null;

            String sql = "SELECT id,key,value from settings WHERE key = ?";
            String selectionArgs[] = {key};
            c = localDBRW.rawQuery(sql, selectionArgs);

            if (c == null) {
                    return "";
            }
            if (c.getCount()<1) {
                    c.close();
                    return "";
            }

            c.moveToFirst();
            recordID = c.getString(c.getColumnIndex("id"));
            c.close();

            return recordID;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...