java - 方法执行多次而不是一次
问题描述
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 在关闭活动时也没有工作...所以有人请帮帮我
解决方案
活动完成后,您可能从未移除过侦听器。您添加一个侦听器ref.addValueEventListener()
,但从不删除它ref.removeEventListener()
。如果您从不删除侦听器,它将继续触发新的更改。在 Android 上,您通常使这些调用对称,因此如果您在 onStart 期间添加一个侦听器,您将在 onStop 期间删除它。
推荐阅读
- apache-spark - 在写入 S3 时,为什么我得到 FileNotFoundException
- sql - 在休眠中定义唯一键以及如何定义?
- azure - 在 Microsoft 合作伙伴中心和 Azure AD 门户中删除域/租户或关闭帐户
- javascript - Project Euler #39:有没有更有效的方法来解决这个问题?
- python - 如果该值在范围内,则查找值
- javascript - 如何使所选项目在反应js的侧栏中处于活动状态?
- python - Spyder 更新后打不开
- python - 在Python中没有ORM的http服务器(Flask)中处理sql连接的最佳方法是什么?
- c# - 如何将一个 HttpClient 注入多个服务
- ruby-on-rails - 可以使用关联来过滤 rails where 子句中的数据吗?