Вставка контента Android-провайдера занимает много времени - PullRequest
7 голосов
/ 01 декабря 2011

Я сделал свой собственный контент-провайдер, куда я помещал много данных одновременно с несколькими вставками.

Приложение получит данные из внешнего источника, и в данный момент я получаю около 30 наименований (т.е. 30 раз вставка).

Теперь я заметил, что это занимает много драгоценного времени (около 3 секунд, 100 мс на каждую вставку).

Как я могу улучшить скорость работы контент-провайдера? Я уже пытался объединить их всех вместе, но это займет до 5 секунд.

Заранее спасибо.

Ответы [ 2 ]

21 голосов
/ 01 декабря 2011

оборачивает все это в insertBulk в транзакции.

Пример:

    SQLiteDatabase sqlDB = mDB.getWritableDatabase();
    sqlDB.beginTransaction();
    try {

        for (ContentValues cv : values) {
            long newID = sqlDB.insertOrThrow(table, null, cv);
            if (newID <= 0) {
                throw new SQLException("Failed to insert row into " + uri);
            }
        }
        sqlDB.setTransactionSuccessful();
        getContext().getContentResolver().notifyChange(uri, null);
        numInserted = values.length;
    } finally {
        sqlDB.endTransaction();
    }

bulkInsert не использует транзакции по умолчанию, поскольку поведение по умолчанию просто вызывает insert:

Переопределите это для обработки запросов на вставку набора новых строк, или реализация по умолчанию будет перебирать значения и вызывать insert (Uri, ContentValues) для каждого из них.

3 голосов
/ 01 декабря 2011

выполнение вставок в транзакции значительно повышает скорость, поскольку происходит только одна запись в базу данных actall:

db.beginTransaction();
try {
    // do the inserts
    db.setTransactionSuccessful()
} finally {
    db.endTransaction();
}

Однажды я экспериментировал, пытаясь улучшить скорость записи примерно на ~ 2000 записей,и это было единственное большое улучшение, которое я обнаружил.

Выполнение db.setLockingEnabled(false) Я думаю, что это дало улучшение примерно на 1%, но тогда вы также должны убедиться, что другие потоки не пишут в БД.Удаление избыточных индексов также может дать небольшой прирост, если таблица огромна.

...