我正在尝试检索保存在我的 Room 数据库表中的长字符串。但我观察到 DAO 查询仅返回该字符串的前 5,000 个字符。
将数据库转储到我的设备并检查它(使用 SQLite 的数据库浏览器)后,我可以看到数据库中存在完整的 11,000 个字符。完整的未截断文本存在于我的
ENTRIES
表和我的 ENTRIES_content
表中。
房间实体:
//@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
public interface EntriesDAO {
...
@Query("SELECT *, rowid FROM ENTRIES WHERE date LIKE :date")
Entry getEntryByDate(String date);
}
使用 ViewModel 模式从数据库检索条目,该模式调用存储库层,然后最终调用我上面显示的 DAO 方法。
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
Entry getEntryByDateRaw(SupportSQLiteQuery query);
// Used with this
//SupportSQLiteQuery query = new SimpleSQLiteQuery("SELECT * FROM ENTRIES WHERE date LIKE ?", new Object[]{ "%2024-01-01%" });
//return mEntriesViewModel.getEntryByDateRaw(query);
我终于解决了。在我的代码的一部分中,我使用了以下内容:
editText.setInputType(InputType.TYPE_NULL);
此代码在内部检查输入类型是否是多行输入类型,无论是
TYPE_CLASS_TEXT
还是TYPE_TEXT_FLAG_MULTI_LINE
,如果不是(并且不是TYPE_NULL
的情况),那么它将应用setSingleLine(true)
.
并且这个调用将最大文本长度限制为我所看到的5000:
... 请注意,由于性能原因,通过为 EditText 设置单行,如果不应用其他字符限制,最大文本长度将设置为 5000。public void setSingleLine (boolean singleLine)