首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将带有较小字段的新POJO类映射到现有的Room表

将带有较小字段的新POJO类映射到现有的Room表
EN

Stack Overflow用户
提问于 2020-02-23 15:06:53
回答 6查看 2K关注 0票数 6

目前,我们有以下的Dao和模型类。

NoteDao

代码语言:javascript
复制
@Query("SELECT * FROM note")
public abstract LiveData<List<Note>> getAllNotes();

备注类

代码语言:javascript
复制
@Entity(
    tableName = "note"
)
public class Note {
    @ColumnInfo(name = "title")
    private String title;

    // Can contain a huge String.
    @ColumnInfo(name = "body")
    private String body;
}

但是,在某些情况下,我们只对加载title感兴趣。

一次用大的Note字符串加载所有body,可能会导致OutOfMemoryException

有没有办法,我们可以创建另一个POJO,如下所示?

代码语言:javascript
复制
public class SimpleNote {
    private String title;
}

然后,我们可以从SimpleNote返回NoteDao的列表。

代码语言:javascript
复制
@Query("???")
public abstract LiveData<List<SimpleNote>> getAllSimpleNotes();
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2020-02-27 07:31:25

https://developer.android.com/training/data-storage/room/accessing-data#query-subset-cols文档中可以看到:

大多数情况下,您只需要获得实体的几个字段。例如,您的UI可能只显示用户的名字和姓氏,而不是显示用户的每个细节。通过只获取出现在应用程序UI中的列,可以节省宝贵的资源,并且查询完成得更快。 空间允许您从查询中返回任何基于Java的对象,只要结果列集可以映射到返回的对象中。例如,您可以创建以下简单的基于Java的旧对象(POJO)来获取用户的名称和姓氏:

代码语言:javascript
复制
data class NameTuple(
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
)

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

代码语言:javascript
复制
@Dao
interface MyDao {
    @Query("SELECT first_name, last_name FROM user")
    fun loadFullName(): List<NameTuple>
}

Room理解查询返回first_namelast_name列的值,并且可以将这些值映射到NameTuple类的字段中。因此,Room可以生成正确的代码。如果查询返回的列太多,或者NameTuple类中不存在列,空间将显示一个警告。

回到您的情况:将SimpleNote定义为这样:

代码语言:javascript
复制
public class SimpleNote {
    @ColumnInfo(name = "title")
    private String title;
}

然后您可以查询该表:

代码语言:javascript
复制
@Query("SELECT title FROM note")
public abstract LiveData<List<SimpleNote>> getAllSimpleNotes();
票数 4
EN

Stack Overflow用户

发布于 2020-02-27 04:04:07

这对你是有用的:

代码语言:javascript
复制
@Query("SELECT title FROM note") 
LiveData<List<String>> getAllNoteTitles();

调用SELECT *时,它将选择表中的所有字段。

票数 5
EN

Stack Overflow用户

发布于 2020-02-27 04:16:20

与使用String类型不同,您可以将其映射到Note,即使没有选择body列:

代码语言:javascript
复制
@Query("SELECT title FROM note")
LiveData<List<Note>> getAllNotesPreview();

在Room中,@Entity通常被映射为1:1到一个表,这对于奥姆来说是很常见的。因此,不可能将两个对象自动映射到同一个表。按列名称选择似乎是最少的努力,这是没有问题的,只有从那里阅读。对于读/写访问,仍然需要记录的完整详细视图,其中包含所有列。

尽管提供的代码看起来类似Java,但在Kotlin中,这也可能是:

代码语言:javascript
复制
@Query("SELECT title FROM note")
Flow<List<Note>> getAllNotesPreview();

这将排除变异,当并非所有列都已被查询和映射时,这是有意义的。否则,它可能只是空白缺失的body列时,例如。编辑title列。请参阅用流与房 (CodeLab)或基于Kotlin的Android单向数据流 (关于一个大致类似的示例应用程序,请参阅关联的GitHub存储库,它正在演示它)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60363574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档