java - 方法执行多次而不是一次

标签 java android database sqlite firebase

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!
        }
    });

这个问题是我第一次打开 Activity ,如果有一个 child 要添加到 sqlite 中的表中,它通常会毫无问题地添加,然后我关闭 Activity 并再次打开它并添加 child 两次,即使只有一个,如果我关闭并再次打开它,它会增加三次而不是一次,然后它就会继续......那么为什么这是行为,我如何才能像第一次那样将它更改为只执行一次打开 Activity ...而且我无法使用 valueforsingleevent,因为当我每秒都在 Activity 中时我需要听听者...并且 removelistener 在关闭 Activity 时也没有工作...所以有人请帮帮我

最佳答案

很可能您从未在 Activity 结束时移除监听器。您使用 ref.addValueEventListener() 添加一个监听器, 但永远不要用 ref.removeEventListener() 删除它.如果您从不删除监听器,它将继续触发新的更改。在 Android 上,您通常使这些调用对称,因此如果您在 onStart 期间添加监听器,您将在 onStop 期间将其删除。

关于java - 方法执行多次而不是一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53418007/

相关文章:

带有自定义 ArrayList 的 java.util.ConcurrentModificationException

android - view_holder 的 Recycler View 可重用性。如何保持特定位置项目的可见性?

C# SQL INSERT 未出现在数据库表 "no errors or exceptions thrown"中

java - Weka 打印稀疏 arff 文件

java - 通过IDE(intelliJ)运行Shell脚本并接收: Windows Subsystem for Linux has no installed distributions

java - 将字符串拆分为仅 3 个字符。 java

android - 如何为 Raspberry Pi3 设置 WiFi 网络共享到 Android Things

android - 在 Android 应用程序中设置 zxing 2.0 条码扫描器

django - Feed算法+数据库: Either too many rows or too slow retrieval

JavaScript promise 以相反的顺序加载