Вы забыли +
в строке 4 .
Если это просто ошибка копирования / прошествия, то в исходном запросе должно быть что-то не так, что вы удалили при попыткечтобы сделать его общим для вашего вопроса.
Это должно работать, вот рабочий пример:
Онлайн пример
Код:
BEGIN TRANSACTION;
/* Create tables */
CREATE TABLE table1(
id integer PRIMARY KEY,
field1 text,
field2 text
);
CREATE TABLE table2(
id integer PRIMARY KEY,
field1 text,
foreign_field1 integer,
FOREIGN KEY(foreign_field1) REFERENCES table1(id)
);
/* Create few records */
INSERT INTO table1 VALUES(1,'Tom', 'French');
INSERT INTO table1 VALUES(2,'Lucy', 'American');
INSERT INTO table1 VALUES(3,'Frank', 'English');
INSERT INTO table1 VALUES(4,'Jane', 'Polish');
INSERT INTO table1 VALUES(5,'Robert', 'French');
INSERT INTO table2 VALUES(1,'Monday', 3);
INSERT INTO table2 VALUES(2,'Wednesday', 5);
INSERT INTO table2 VALUES(3,'Friday', 1);
INSERT INTO table2 VALUES(4,'Tuesday', 4);
INSERT INTO table2 VALUES(5,'Monday', 1);
COMMIT;
/* Display records from the table1 */
SELECT * FROM table1;
/* Update records from table1 */
UPDATE table1
SET (field1, field2) = (
SELECT
SUM(table2.foreign_field1) as summaryForeign_field1,
table2.field1
FROM table2
WHERE table1.id = table2.id
GROUP BY table2.field1
);
/* Check that the update has been executed correctly */
SELECT * FROM table1;
Так что, возможно, попробуйте создать минимальный онлайн-пример ближе к вашему исходному запросу.
РЕДАКТИРОВАТЬ : ОК, согласно вашему комментарию, который я протестировал, и могу воспроизвести проблему в моем проектедействительно, он не компилируется, ошибка:
ошибка: нет жизнеспособной альтернативы на входе 'обновление теста SET (имя,' посторонний вход ')' ожидание {, ';', ',','=', '*', '+', '-', '||', '/', '%', '<<', '>>', '&', '|', '<', '<=', '>', '> =', '==', '! =', '<>', ...}
К сожалению, я думаю, что это комнатаограничение.Возможно, вы можете отправить вопрос в Google, чтобы получить больше информации об этом.
Между тем, вы можете попробовать с RawQuery (как указано в документе, он ДОЛЖЕН возвращать тип, отличный от void, но выможет возвратить поддельную строку или пустой POJO, например):
@RawQuery
String setFieldsInTable1(SupportSQLiteQuery query);
Затем используйте его так:
SimpleSQLiteQuery query = new SimpleSQLiteQuery("UPDATE table1 SET ...");
yourDao.setFieldsInTable1(query);
Другое решение состоит в том, чтобы просто пойти с двумя подзапросами следующим образом:
UPDATE table1
SET field1 = (
SELECT SUM(table2.foreign_field1)
FROM table2
WHERE table1.id = table2.id
GROUP BY table2.foreign_field2
),
field2 = (
SELECT table2.foreign_field2
FROM table2
WHERE table1.id = table2.id
);
Также в зависимости от рабочего процесса приложения вы можете изменить свою сущность в своем коде, а затем использовать интерфейс Update
для ее обновления:
@Update
void update(Table1Entity... table1Entities);