Android Room 数据库仅返回文本字段的前 5000 个字符

问题描述 投票:0回答:1

我正在尝试检索保存在我的 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);
android android-sqlite android-room fts4 sqlcipher-android
1个回答
0
投票

我终于解决了。在我的代码的一部分中,我使用了以下内容:

editText.setInputType(InputType.TYPE_NULL);

此代码在内部检查输入类型是否是多行输入类型,无论是

TYPE_CLASS_TEXT
还是
TYPE_TEXT_FLAG_MULTI_LINE
,如果不是(并且不是
TYPE_NULL
的情况),那么它将应用
setSingleLine(true) 
.

并且这个调用将最大文本长度限制为我所看到的5000:

public void setSingleLine (boolean singleLine)
... 请注意,由于性能原因,通过为 EditText 设置单行,如果不应用其他字符限制,最大文本长度将设置为 5000。

© www.soinside.com 2019 - 2024. All rights reserved.