#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);
}
}