You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:36:02