Android: обновить таблицу SQLite, используемую в другом приложении

Я написал приложение, которое сортирует плейлисты Poweramp, и оно работает нормально. Единственная проблема, с которой я сталкиваюсь, - это производительность, и я думаю, это потому, что я вызываю getContentResolver().update для каждой строки. В идеале я хотел бы иметь возможность использовать транзакцию SQLite. applyBatch и bulkInsert не будут работать, так как мне нужно иметь предложение WHERE с каждым обновлением строки - мне, по сути, нужно обновить индексную таблицу, в которой есть несколько списков воспроизведения и их песни.

Насколько я понимаю, я не смогу получить доступ к базе данных Poweramp напрямую через SQLite, поскольку я читал, что мне нужна такая же подпись приложения или что-то в этом роде? Может быть, кто-то может это прояснить. Похоже, моя единственная надежда состоит в том, чтобы переопределить метод applyBatch ContentResolver или добавить свой собственный (из this thread< /а>)? Хотя я не совсем уверен, как это переопределить... код в этом потоке, похоже, уже каким-то образом переопределил класс. Я также не думаю, что он использует внешнюю БД.

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


person incutonez    schedule 31.01.2019    source источник
comment
Почему applyBatch не работает? Вы можете создать ContentProviderOperation, используя ContentProviderOperation.Builder, которые поддерживают предложения WHERE.   -  person MatPag    schedule 31.01.2019
comment
Может быть, я не видел эту часть, но для этого также требовалось ПОЛНОМОЧИЕ, о котором я понятия не имел, что там должно быть... Я попытался поместить туда имя пакета, но получил какое-то исключение приложения для Android.   -  person incutonez    schedule 31.01.2019
comment
AUTHORITY — это что-то конкретное для ContentProviders, если вы почитаете официальную документацию о них, вы, вероятно, узнаете, для чего они используются.   -  person MatPag    schedule 31.01.2019
comment
Я немного читал об этом и все еще был в замешательстве... Я не использую БД в своем пакете, поэтому я пробовал использовать комбинацию имени пакета Poweramp, имени моего пакета и т. д.... ничего не вышло. Работа. Я думаю, я попытаюсь копнуть немного глубже с этим.   -  person incutonez    schedule 31.01.2019


Ответы (1)


В итоге я выбрал ContentProviderOperation и getContentResolver().applyBatch (спасибо @MatPag, давшему совет, что это возможно)... теперь это работает намного быстрее, и я больше не получаю сообщения ожидания. Ключевая часть applyBatch заключается в том, что вы должны обернуть его в try..catch, что не очевидно из-за ошибки Android Studio, о которой он сообщает. Вот окончательный код:

Cursor songs = createPlaylistCursor(sort);
if (songs.moveToFirst()) {
    int i = 0;
    Uri playListUri = getPlaylistUri();
    ArrayList<ContentProviderOperation> cs = new ArrayList<ContentProviderOperation>();
    do {
        cs.add(ContentProviderOperation.newUpdate(playListUri)
          .withSelection("folder_file_id=" + songs.getInt(songs.getColumnIndexOrThrow("folder_files._id")), null)
          .withValue("sort", i++)
          .build());
    } while (songs.moveToNext());
    try {
        getContentResolver().applyBatch("com.maxmpz.audioplayer.data", cs);
    }
    catch (Exception e) {
    }
}
person incutonez    schedule 01.02.2019