下面是以livedata的形式從sqlite資料庫獲取資料的代碼
private LiveData<ArrayList<Message>> loadAllMessagesOfThisChat() {
final MutableLiveData<ArrayList<Message>> messages= new MutableLiveData<> ()。
ArrayList<Message> messagesArrayList = new ArrayList<>()。
SQLiteDatabase mDb = messagesDbHelper.getReadableDatabase()。
String[] projection = {
MessageDetails.COLUMN_SENDER_UID,
MessageDetails.COLUMN_MESSAGE,
MessageDetails.TIMESTAMP_ID,
MessageDetails.COLUMN_IMAGE_URI}。
Cursor cursor = mDb. query("receiver" receiverUID, projection, null, null, null, null, null)。)
int messageColumnIndex = cursor.getColumnIndex(MessageDetails.COLUMN_MESSAGE)。
int timestampColumnIndex = cursor.getColumnIndex(MessageDetails.TIMESTAMP_ID)。
int imageURIColumnIndex = cursor.getColumnIndex(MessageDetails.COLUMN_IMAGE_URI)。
int senderUIDColumnIndex = cursor.getColumnIndex(MessageDetails.COLUMN_SENDER_UID)。
while (cursor.moveToNext() ) {
Message message = new Message()。
message.setMessage(cursor.getString(messageColumnIndex))。
message.setImageUrl(cursor.getString(imageURIColumnIndex))。
message.setTimestamp(String.valueOf(cursor.getInt(timestampColumnIndex))。
message.setUserID(cursor.getString(senderUIDColumnIndex))。
messagesArrayList.add(message)。
}
messages.setValue(messagesArrayList)。
cursor.close();
mDb.close()。
return (LiveData<ArrayList<Message>>) messages。
}
而我在oncreate中使用這個
LiveData<ArrayList< Message>> messages=loadAllMessagesOfThisChat()。
messages.observe(this, new Observer<ArrayList<Message>> () {
@Override
public void onChanged(ArrayList<Message> messages) {
messagesAdapter.setMessages(messages)。
}
});
但是每當我發送一條新的訊息時,它就會被添加到資料庫中,但是在我重新啟動我的活動之前,變化并沒有反映在用戶界面中
。似乎觀察者沒有做任何事情
。我正試圖使用Livedata和sqlite,因為我由于某些原因不能使用room
。uj5u.com熱心網友回復:
在你的代碼中。沒有異步編程,所以你的代碼是同步運行的。 這意味著你先呼叫setValue(),然后回傳liveData的物件。這導致沒有做任何事情,因為觀察者是在呼叫setValue()方法后設定的。所以觀察者并沒有觀察到任何東西。
我可以想到2種解決方案
uj5u.com熱心網友回復:
不要在本地 sqllite 中使用 livedata,而是在更新你的資料庫后呼叫 另外,您可以呼叫
標籤: 上一篇:我有JavaMap<String,List<String>>和Stringvar,如何在不使用For回圈的情況下回傳其值(List)包含Stringvar的鍵?
notifyDataSetChanged()。這將用最新的值重新填充 listview。
reCreate()來重新啟動您的活動。
