Android Room数据库查询仅返回文本字段前5000字符的问题
问题:Room查询FTS4表返回字符串被截断为5000字符
我在Android Room的FTS4表中存储了11000字符的长文本,通过DB Browser for SQLite导出数据库检查,确认ENTRIES主表和ENTRIES_content表中都保留了完整内容,但通过DAO查询时,返回的字符串仅保留前5000字符。
相关代码
实体类
//@Fts4(tokenizer = FtsOptions.TOKENIZER_UNICODE61) @Fts4 @Entity(tableName = "ENTRIES") public class Entry { private int rowid; @ColumnInfo(name = "date") private String date; @ColumnInfo(name = "entry") private String entryText; public String getEntryText() { return entryText; } }
DAO接口
@Dao public interface EntriesDAO { ... @Query("SELECT *, rowid FROM ENTRIES WHERE date LIKE :date") Entry getEntryByDate(String date); }
调用逻辑
mEntriesViewModel = new ViewModelProvider(this, factory).get(EntriesViewModel.class); ... Entry currentEntry = mEntriesViewModel.getEntryByDate(entryDate); String entryText = currentEntry.getEntryText(); entryText.length(); // 结果为5000
已尝试的替代查询(均无效)
// 子查询方式 @Query("SELECT *, rowid FROM ENTRIES WHERE rowid = (SELECT rowid FROM ENTRIES WHERE date LIKE :date)") // RawQuery方式 @RawQuery Entry getEntryByDateRaw(SupportSQLiteQuery query); // 使用示例 //SupportSQLiteQuery query = new SimpleSQLiteQuery("SELECT * FROM ENTRIES WHERE date LIKE ?", new Object[]{ "%2024-01-01%" }); //return mEntriesViewModel.getEntryByDateRaw(query);
解决方案
1. 强制转换文本类型查询
修改DAO的查询语句,对长文本列使用CAST转换为TEXT类型,确保Room能读取完整字符串:
@Query("SELECT rowid, date, CAST(entry AS TEXT) AS entry FROM ENTRIES WHERE date LIKE :date") Entry getEntryByDate(String date);
2. 直接查询FTS content表
FTS4的content表(ENTRIES_content)存储了原始完整数据,可直接查询该表:
@Query("SELECT c.docid AS rowid, c.date, c.entry FROM ENTRIES_content c WHERE c.date LIKE :date") Entry getEntryByDate(String date);
注意:实体类中的rowid字段会映射到content表的docid主键。
3. 增大CursorWindow大小
若截断是由于CursorWindow默认大小限制导致,可在数据库构建时调整窗口大小:
Room.databaseBuilder(getApplicationContext(), YourDatabaseClass.class, "your_database_name") .setCursorWindowSize(10 * 1024 * 1024) // 设置为10MB,按需调整 .build();
内容的提问来源于stack exchange,提问作者Prof
相关产品推荐
相关产品推荐

