首页 > 解决方案 > 如何使用 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 但它不起作用。

标签: androidsqlite

解决方案


您可以使用 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);
    }

推荐阅读