android - 如何使用 sqlite 数据库表即时更新 recyclerview?
问题描述
我使用 sqlite 数据库来存储用户消息。我的代码处于活动状态。
private MyDbHandler myDbHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message);
myDbHandler=new MyDbHandler(MessageActivity.this,MessageReceiverId+".db",null,1);
messagesAdapter=new MessagesAdapter(myDbHandler.sqlMessagesList(),this,messageList);
messageList=(RecyclerView)findViewById(R.id.message_list_user);
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
messageList.setHasFixedSize(true);
messageList.setLayoutManager(linearLayoutManager);
messageList.setAdapter(messagesAdapter);
sendMessageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
addMessageInSqlite();
}
});
private void addMessageInSqlite()
{
String messageText=userMessageInput.getText().toString();
if (TextUtils.isEmpty(messageText))
{
Toast.makeText(this, "please write message first", Toast.LENGTH_SHORT).show();
}
else
{
myDbHandler.saveNewMessageFromSender(message_push_id,messageText,"text",MessageSenderId,tsLong,MessageReceiverId);
}
MydbHandler 的方法
public void saveNewMessageFromSender(String message_push_id, String messageText, String text, String messageSenderId, Long timestamp, String messageReceiverId)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_MESSAGE, messageText);
values.put(COLUMN_FROM, messageSenderId);
values.put(COLUMN_TYPE, text);
values.put(COLUMN_TIMESTAMP,timestamp);
values.put(COLUMN_PUSH_KEY,message_push_id);
values.put(COLUMN_DELIVERY,0);
values.put(COLUMN_SEEN,0);
long rowInserted = db.insert(TABLE_NAME,null, values);
db.close();
}
public List<SqlMessages> sqlMessagesList()
{
String query = "SELECT * FROM " + TABLE_NAME;
List<SqlMessages> messagesList=new LinkedList<>();
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
SqlMessages sqlMessages;
if (cursor.moveToFirst()) {
do {
sqlMessages = new SqlMessages();
sqlMessages.setId(cursor.getLong(cursor.getColumnIndex(COLUMN_ID)));
sqlMessages.setPushkey(cursor.getString(cursor.getColumnIndex(COLUMN_PUSH_KEY)));
sqlMessages.setFromid(cursor.getString(cursor.getColumnIndex(COLUMN_FROM)));
sqlMessages.setType(cursor.getString(cursor.getColumnIndex(COLUMN_TYPE)));
sqlMessages.setMessage(cursor.getString(cursor.getColumnIndex(COLUMN_MESSAGE)));
sqlMessages.setTimestamp(cursor.getLong(cursor.getColumnIndex(COLUMN_TIMESTAMP)));
sqlMessages.setDelivery(cursor.getLong(cursor.getColumnIndex(COLUMN_DELIVERY)));
sqlMessages.setSeen(cursor.getLong(cursor.getColumnIndex(COLUMN_SEEN)));
messagesList.add(sqlMessages);
} while (cursor.moveToNext());
}
return messagesList;
}
仅当活动创建时,此消息才会完美地显示在 recyclerview 中,这意味着从活动返回并再次进入活动。 每当发件人将新消息存储在sqlite数据库中时,我都需要在活动中即时更新recyclerview。 我也使用了 notifydatasetchanged 但它不起作用。
解决方案
您可以使用 LocalBroadcast 进行 recyclerView 的实时更新,也可以使用 LiveData。我正在为 Brodacast 方法编写代码。
保存消息时,调用此方法:
Intent resultsIntent=new Intent(”custom_action_broadcast");
LocalBroadcastManager localBroadcastManager =LocalBroadcastManager.getInstance(this);
localBroadcastManager.sendBroadcast(resultsIntent);
在 recyclerView Activity 中,进行如下广播:
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Here update your RecyclerView Here
}
};
@Override
protected void onStart() {
super.onStart();
IntentFilter filter = new IntentFilter(“custom_action_broadcast”);
LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, filter);
}
@Override
protected void onStop() {
super.onStop();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mReceiver);
}
推荐阅读
- mongodb - 连接到 AWS 上的 DocumentDB/MongoDB 实例时出现问题
- javascript - 如何获取时刻时区当前配置的时区?
- python - 子类化一个python类来改变初始化器是最好的模式吗?
- javascript - 如何使用 sequelize 和节点插入由多个对象组成的数组?
- ios - Objective-C 数据类型问题
- postgresql - 完全重新安装后 psql 无法连接到服务器 [Ubuntu 21.10 / PostgreSQL 13]
- android - drawableLeft图标和文本之间的Android MaterialButton填充
- python - Pymongo update_many 没有为地理空间过滤器添加新字段
- javascript - 如何将 react-to-print 库转换为下一个 js
- django - 当用户上传更多图片时,如何在 django gridview 中保持图像的一致显示,而不是传递给 forloop 的条件