метод выполняется несколько раз вместо одного - PullRequest
0 голосов
/ 21 ноября 2018
Query ref = mDatabaseReference.child("Messages")
            .child(MessageRecieverId).child(MessageSenderId).orderByChild("Seen").equalTo(false);
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            long count = 0;
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                count = dataSnapshot.getChildrenCount();

                MainData helper = new MainData(getApplicationContext()); //Change the name to your Helper Class name
                SQLiteDatabase db = helper.getWritableDatabase();
                String newId = "MyData";
                Cursor data = helper.getData();
                long newDatar = 0;
                long newDatat = 0;
                while(data.moveToNext()){
                    newId = data.getString(data.getColumnIndex("Data"));
                    newDatar = data.getInt(data.getColumnIndex("TotalMessagesRecieved"));
                    newDatat = data.getInt(data.getColumnIndex("TotalMessages"));
                }
                ContentValues contentValues = new ContentValues();
                contentValues.put(KEY_DATA, newId);
                contentValues.put(KEY_TOTAL_MESSAGES_RECIEVED, (newDatar+count));
                contentValues.put(KEY_TOTAL_MESSAGES, (newDatat+count));//Change the value of newData(which is actually your old value) by incrementing
                long returnVariable = db.update(TABLE_MAIN_DATA, contentValues, null, null);

                if(returnVariable == -1){
                    Toast.makeText(getApplication(),"Nope", Toast.LENGTH_LONG).show();
                    //-1 means there was an error updating the values
                }
                else{
                    Toast.makeText(getApplication(),"r", Toast.LENGTH_SHORT).show();
                }
            }
            Log.d("CMONNN", String.valueOf(count)); //Will print the number of seen messages
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d("CMONNN", databaseError.getMessage()); //Don't ignore errors!
        }
    });

Проблема в том, что я первый раз открываю действие, и если в sqlite добавляется один дочерний элемент, он обычно добавляется без проблем, а затем я закрываю действие и открываю его снова ион добавляет ребенка дважды, даже если есть только один, и если я закрываю и открываю его снова, он добавляет трижды вместо одного, и он просто продолжается ... Итак, почему это ведет себя и как я могу изменить его на выполнение только один раз, какв первый раз, когда я открываю мероприятие ... И я не могу использовать valueforsingleevent, так как мне нужно слушать слушателя, когда я нахожусь внутри занятия каждую секунду ... и removelistener тоже не работал при закрытии занятия ... Так что кто-то, пожалуйста, помогите мне

1 Ответ

0 голосов
/ 21 ноября 2018

Вполне вероятно, что вы никогда не удаляли слушателя по окончании действия.Вы добавляете слушателя с помощью ref.addValueEventListener(), но никогда не удаляете его с помощью ref.removeEventListener().Если вы никогда не удаляете слушателя, он продолжит запускаться с новыми изменениями.В Android вы обычно делаете эти вызовы симметричными, поэтому, если вы добавите прослушиватель во время onStart, вы удалите его во время onStop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...