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

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

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

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

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

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

0
0
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Сомневаюсь, что такой метод существует. Хотя вы могли бы рассмотреть следующий обходной путь (конечно, у него есть некоторые недостатки, но вы могли бы подумать, подходит ли он в вашем конкретном случае) - перед вставкой, чтобы получить максимальное id и явно установить ids в ваших объектах Parent и Child. Допустим, у вас есть 200 элементов для вставки. Вы получаете максимальный текущий id - 1000. Затем вы устанавливаете id в вашей первой паре Родитель/Ребенок - 1001, во второй - 1002 и так далее. При этом вы можете вставлять родительские и дочерние списки в один 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 result;
        } finally {
            release(stmt);
        }
    }

Другие вопросы по теме