如何在android中使用Room Library fts4查询整个表

Posted

技术标签:

【中文标题】如何在android中使用Room Library fts4查询整个表【英文标题】:How to query entire table using Room Library fts4 in android 【发布时间】:2020-09-15 12:05:19 【问题描述】:

我有用 Java 编写的 Notes 应用程序。以下是 Room Database 使用的主要部分:

我有此道:

@Dao
public interface NoteDao 

    @Query("INSERT INTO notes (contents) VALUES ('new note')")
    void create();

    @Query("SELECT * from notes; ")
    List<Note> getAllNotes();

    @Query("UPDATE notes SET contents = :contents WHERE rowid = :id")
    void save(String contents, int id);

    @Query("DELETE from notes WHERE rowid = :id")
    void delete(int id);

getAllNotes() 函数编译失败的地方,错误如下: “查询返回的列在 com.sultanraja.notes.Note 中没有字段 [rowid],即使它们被注释为非空或原始。查询返回的列:[contents]”

Note类如下:

@Fts4
@Entity(tableName = "notes")
public class Note 
    @PrimaryKey
    @NonNull
    public int rowid;

    @ColumnInfo(name = "contents")
    public String contents;


而数据库如下:

@Database(entities = Note.class, version = 2, exportSchema = false)
public abstract class NotesDatabase extends RoomDatabase 

    public abstract NoteDao NoteDao();

在我拥有这个版本的数据库之前,我有一个不是 fts4 的普通数据库,一切都很好。在我更改架构并使用 fts4 表后,select * from table 不会返回所有列并且会发生编译错误。问题是为什么?

谢谢。

【问题讨论】:

【参考方案1】:

它不能 ORM 映射那个字段。尝试正确注释:

@PrimaryKey
@NonNull
@ColumnInfo(name = "id")
public int rowid;

或者用它的预期名称来称呼它:

@PrimaryKey
@NonNull
public int id;

如果有疑问,只需使用编辑器打开数据库并查看该列的调用方式。 android Studio 同时也有这样的编辑器。提示:默认情况下,SQLite 将其称为_id。 SQLite 命令.schema notes 也会显示表定义。

【讨论】:

问题是如果我用除 rowid 以外的任何名称调用它,我会收到以下编译错误:“FTS 实体中的单个主键字段必须命名为 'rowid' 或必须注释与@ColumnInfo(name = "rowid")"【参考方案2】:

尝试将您的查询更改为(我知道这有点奇怪,但应该可以):

@Query("SELECT *, notes.rowid from notes")
List<Note> getAllNotes();

【讨论】:

谢谢,我认为它可能会起作用,起作用的是:@Query("SELECT *, rowid from notes")

以上是关于如何在android中使用Room Library fts4查询整个表的主要内容,如果未能解决你的问题,请参考以下文章

Android Room Persistence Library - 如何查找 ID 列表中包含 ID 的实体?

从 SQLite 迁移到 Android Room Persistence Library

如何将 Room Persistence Library 与预填充的数据库一起使用?

调用 Rooms inMemoryBuilder 方法时,Room Persistence Library 运行时异常

使用Room Library时,数据库中的数据始终返回Empty Array

查看使用 Room Persistence Library 创建的数据库的内容