目前,我们有以下的Dao和模型类。
NoteDao
@Query("SELECT * FROM note")
public abstract LiveData<List<Note>> getAllNotes();备注类
@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,如下所示?
public class SimpleNote {
private String title;
}然后,我们可以从SimpleNote返回NoteDao的列表。
@Query("???")
public abstract LiveData<List<SimpleNote>> getAllSimpleNotes();发布于 2020-02-27 07:31:25
在https://developer.android.com/training/data-storage/room/accessing-data#query-subset-cols文档中可以看到:
大多数情况下,您只需要获得实体的几个字段。例如,您的UI可能只显示用户的名字和姓氏,而不是显示用户的每个细节。通过只获取出现在应用程序UI中的列,可以节省宝贵的资源,并且查询完成得更快。 空间允许您从查询中返回任何基于Java的对象,只要结果列集可以映射到返回的对象中。例如,您可以创建以下简单的基于Java的旧对象(POJO)来获取用户的名称和姓氏:
data class NameTuple(
@ColumnInfo(name = "first_name") val firstName: String?,
@ColumnInfo(name = "last_name") val lastName: String?
)现在,您可以在查询方法中使用这个POJO:
@Dao
interface MyDao {
@Query("SELECT first_name, last_name FROM user")
fun loadFullName(): List<NameTuple>
}Room理解查询返回
first_name和last_name列的值,并且可以将这些值映射到NameTuple类的字段中。因此,Room可以生成正确的代码。如果查询返回的列太多,或者NameTuple类中不存在列,空间将显示一个警告。
回到您的情况:将SimpleNote定义为这样:
public class SimpleNote {
@ColumnInfo(name = "title")
private String title;
}然后您可以查询该表:
@Query("SELECT title FROM note")
public abstract LiveData<List<SimpleNote>> getAllSimpleNotes();发布于 2020-02-27 04:04:07
这对你是有用的:
@Query("SELECT title FROM note")
LiveData<List<String>> getAllNoteTitles();调用SELECT *时,它将选择表中的所有字段。
发布于 2020-02-27 04:16:20
与使用String类型不同,您可以将其映射到Note,即使没有选择body列:
@Query("SELECT title FROM note")
LiveData<List<Note>> getAllNotesPreview();在Room中,@Entity通常被映射为1:1到一个表,这对于奥姆来说是很常见的。因此,不可能将两个对象自动映射到同一个表。按列名称选择似乎是最少的努力,这是没有问题的,只有从那里阅读。对于读/写访问,仍然需要记录的完整详细视图,其中包含所有列。
尽管提供的代码看起来类似Java,但在Kotlin中,这也可能是:
@Query("SELECT title FROM note")
Flow<List<Note>> getAllNotesPreview();这将排除变异,当并非所有列都已被查询和映射时,这是有意义的。否则,它可能只是空白缺失的body列时,例如。编辑title列。请参阅用流与房 (CodeLab)或基于Kotlin的Android单向数据流 (关于一个大致类似的示例应用程序,请参阅关联的GitHub存储库,它正在演示它)。
https://stackoverflow.com/questions/60363574
复制相似问题