如何在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 运行时异常