Самый эффективный способ доступа / записи данных в SQLite на Android - PullRequest
0 голосов
/ 14 февраля 2012

В настоящее время я использую ContentProvider в своем приложении. Из-за «слоев» и реальной потребности в провайдере - я работаю над максимально возможной оптимизацией доступа к данным. Вот моя попытка сделать это:

public static String getPreferenceString(Context context, String key)
    {
        DatabaseHelper helper = new DatabaseHelper(context);
        SQLiteDatabase database = helper.getReadableDatabase();
        SQLiteStatement statement = database.compileStatement("SELECT Value FROM Preferences WHERE Key='" + key + "' LIMIT 1");

        try
        {
            return statement.simpleQueryForString();

        }
        catch (Exception ex)
        {
            return "";
        }
        finally
        {
            statement.close();
            database.close();
            helper.close();
        }
    }

    public static void setPreferenceString(Context context, String key, String value)
    {
        DatabaseHelper helper = new DatabaseHelper(context);
        SQLiteDatabase database = helper.getReadableDatabase();
        SQLiteStatement statement = database.compileStatement("INSERT OR REPLACE INTO Preferences (Key, UpdatedOn, Value) VALUES ('" +
                key + "', '" +
                Utility.getDateConvertedToUTCDBString(new Date()) + "', '" +
                value + "'); ");
        try
        {
            statement.execute();
        }
        finally
        {
            statement.close();
            database.close();
            helper.close();
        }
    }
  1. Это как можно ближе к прямым вызовам SQLite?
  2. Должен ли я иметь все эти .close() операторы в моем коде?
  3. В setPreferenceString я сделал копирование / вставку и позвонил getReadableDatabase, хотя я пишу данные, и это работает. Почему?

1 Ответ

0 голосов
/ 14 февраля 2012

Это как можно ближе к прямым вызовам SQLite?

AFAIK SQL-запросы наиболее близки к RDB

СледуетУ меня есть все эти операторы .close () в моем коде?

Лично я не буду создавать DatabaseHelper, SQLiteDatabase и SQLiteStatement каждый раз, когда я вызываю этот метод.Я бы создал все это перед тем, как они вам понадобятся, и закрою их, когда они больше не будут нужны.Также централизовать это хорошая идея ИМХО (например, с помощью синглтона).

Кроме того, ваш оператор SQL может быть записан как

SELECT Value FROM Preferences WHERE Key= ? LIMIT 1

Таким образом, вам нужно только подготовить его один раз и связать параметры так, как вам требуется оператор.То же самое касается любого запроса SQL.

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