房间更新多个字段

时间:2019-01-30 10:46:26

标签: android sqlite dao android-room android-architecture-components

我想将table 1中的某些字段更新为与另一个table(甚至是子查询)中的值相同。问题是,当字段多于1个时,我在compilation error更新查询中得到了一个DAO

您可以在下面看到代码(改写为通用代码):

@Query("UPDATE table1 " +
     " SET (field1, field2) = " +
     " (SELECT SUM(table2.foreign_field1) as summaryForeign_field1, table2.foreign_field2 " +
     " FROM table2 " +
     " WHERE   table1.id = table2.id " + 
     " GROUP BY table2.foreign_field2 ) ")
void setFieldsInTable1();

我用SQLite Update Query Ref中的注释检查了查询,并在DB Browser中尝试了SQLite中的代码,在该代码中效果很好。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您在第4行上忘记了+

如果这仅仅是一个复制/粘贴错误,那么当您试图使它对您的问题通用时,您删除的原始查询中肯定有问题。

这应该有效,这是一个有效的示例:

Online example

代码:

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;

因此,也许可以尝试构建一个更接近原始查询的在线最小示例。

编辑:根据您的评论,我已经测试过,可以在我的项目中重现该问题,确实无法编译,错误是:

  

错误:在输入“更新测试集(名称,   外来输入 ')' 期待{, ';', '', '=', '*', '+', ' - ',   '||','/','%','<<','>>','&','|','<','<=','>','> =',' ==',   '!=','<>',...}

很遗憾,我认为这是“房间”限制。也许您可以将问题提交给Google,以获得有关此问题的更多信息。

与此同时,您可以尝试使用RawQuery(如文档中所述,它必须返回非空类型,但是您可以返回例如假字符串或空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);