Можете ли вы полагаться на порядок идентификаторов комнат Android, возвращаемых из многострочной вставки

#android #android-room

#Android #android-room

Вопрос:

Я использую Room для своей локальной базы данных в моем текущем приложении для Android.

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

Могу ли я полагаться на то, что Room возвращает автоматически сгенерированные родительские идентификаторы в том же порядке, что и родительские строки, которые я передал оператору INSERT?

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

Есть ли какой-либо метод, при котором я могу вставить несколько строк Parent -> Children one-2-many и заставить дочерние строки автоматически получать родительский автоматически сгенерированный идентификатор?

Ответ №1:

Есть ли какой-либо метод, при котором я могу вставить несколько строк Parent -> Children one-2-many и заставить дочерние строки автоматически получать родительский автоматически сгенерированный идентификатор?

Я сомневаюсь, что такой метод существует. Хотя вы могли бы рассмотреть следующий обходной путь (конечно, у него есть некоторые недостатки, но вы могли бы подумать, подходит ли он в вашем конкретном случае) — перед вставкой, чтобы получить maximal id и явно установить id s в ваших Parent Child объектах and . Допустим, у вас есть 200 элементов для вставки. Вы получаете максимальный ток id — 1000. Затем вы устанавливаете id ‘s в вашей первой родительской / дочерней паре — 1001, во второй — 1002 и так далее. При этом вы можете вставлять родительские и дочерние списки в single Insert .

Могу ли я полагаться на то, что Room возвращает автоматически сгенерированные родительские идентификаторы в том же порядке, что и родительские строки, которые я передал оператору INSERT?

Вы можете. Просто посмотрите на метод Room insertAndReturnIdsList , который вызывается при вставке списка объектов:

 // THIS METHOD IS CALLED WITHIN TRANSACTION WHEN YOU CALL YOUR INSERT-DAO-METHOD
public final List<Long> insertAndReturnIdsList(Collection<? extends T> entities) {
        final SupportSQLiteStatement stmt = acquire();
        try {
            final List<Long> result = new ArrayList<>(entities.size());
            int index = 0;
            for (T entity : entities) { <-- LOOPING LIST OF INSERTED ENTITIES
                bind(stmt, entity);
                result.add(index, stmt.executeInsert()); <-- INSERT ONE-BY-ONE IN ONE TRANSACTION
                index  ; <-- INDEX OF RESULT LIST MATCHES INDEX OF ENTITIES LIST
            }
            return resu<
        } finally {
            release(stmt);
        }
    }