首页 > 解决方案 > 房间查询返回列子集时出错

问题描述

我在玩 Room,在那里我找不到解决问题的方法。

下面是数据。

桌子

CREATE TABLE `Employee` (
    `id` INTEGER NOT NULL,
    `first_name` TEXT,
    `last_name` TEXT,
    PRIMARY KEY(`id`)
);

表数据

在此处输入图像描述

实体

@Entity(tableName = "Employee")
public class Employee {

    @PrimaryKey
    private int id;

    @ColumnInfo(name = "first_name")
    private String firstName;

    @ColumnInfo(name = "last_name")
    private String lastName;

    ..Getters & Setters..
}

查询 1

@Query("Select * from Employee")
List<Employee> getEmployees();

结果 它成功了

查询 2

@Query("Select first_name, last_name from Employee")
List<Employee> getEmployees();

结果

错误:查询返回的列在 ***.Employee 中没有字段 [id],即使它们被注释为非空或原始。查询返回的列:[first_name, last_name]

如果我添加id到上面Query 2,它可以工作。

同样,如果我们Foreign Key在表中有一个并且我们尝试查询列的子集,它会抛出错误。当我们在查询中添加Primary Key&Foreign Key列时出现错误。

问题 1 这是否意味着我们必须始终在 Query 中包含Primary Key& Foreign Key (如果存在)?

问题 2 引发此类错误的幕后实际发生了什么?还是我做错了什么?

房间版本 1.1.1

另外,参考了这个链接,但它并没有解决我的主键问题。

标签: androidandroid-sqliteandroid-roomandroid-architecture-components

解决方案


要从多个字段中选择数据,请考虑以下示例。

从文档

Room 允许您从查询中返回任何基于 Java 的对象,只要结果列集可以映射到返回的对象。例如,您可以创建以下纯旧的基于 Java 的对象 (POJO) 来获取用户的名字和姓氏:

public class NameTuple {
    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;
}

现在,您可以在查询方法中使用此 POJO:

@Dao
public interface MyDao {
    @Query("SELECT first_name, last_name FROM user")
    public List<NameTuple> loadFullName();
}

推荐阅读