如果我在其中使用变量,实时数据库更新方法将不起作用
Realtime databse endAt method doesn't work if I use variable in that
"Posts" : {
"-MnLFAlhayTv80FxzUfL" : {
"description" : "",
"picture" : "",
"postKey" : "-M",
"timeStamp" : 1635682139495,
"title" : "",
"userId" : "",
"userPhoto" : ""
},
"-MnLFzItc050Sn0EtDho" : {
"description" : "",
"picture" : "",
"postKey" : "-M",
"timeStamp" : 1635682350531,
"title" : "",
"userId" : "b",
"userPhoto" : ""
},
这是我的数据结构。当我尝试像 1635682350531 这样的 long 变量时,我将使用 orderbyChild(timeStamp).endAt() 方法编写一个删除旧 post 的代码 ->> orderbyChild(timeStamp).endAt(1635682350531l);当我将 l 添加到 1635682350531
时它起作用
并且我定义了当前时间戳变量并将其放入 endAt 方法,但它不起作用。我可能认为我没有在我的变量中添加“l”?
这是我的代码。
if (UId.equals("k")) {
long tlong = System.currentTimeMillis(); long ttime;
ttime = tlong - 3*24*60*60*1000;
StorageReference picRef = FirebaseStorage.getInstance().getReferenceFromUrl(postImage);
showMessage(String.valueOf(ttime));
picRef.delete()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
//image deleted, now delete database
DatabaseReference db = FirebaseDatabase.getInstance().getReference();
Query queryByTimestamp = db.child("Posts").orderByChild("timeStamp").endAt(ttime);
queryByTimestamp.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
@Override
public void onComplete(@NonNull Task<DataSnapshot> task) {
if (task.isSuccessful()) {
for (DataSnapshot ds : task.getResult().getChildren()) {
ds.getRef().removeValue();
Toast.makeText(PostDetailActivity.this,"게시글이 삭제되었습니다.",Toast.LENGTH_SHORT).show();
}
} else {
Log.d("TAG", task.getException().getMessage());
Toast.makeText(PostDetailActivity.this,"게시글이 삭제되지않았습니다.",Toast.LENGTH_SHORT).show();
}
}
});
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
//failed, can't go further
Toast.makeText(PostDetailActivity.this, "" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
谢谢你回答我。
当您使用以下查询时:
Query queryByTimestamp = db.child("Posts").orderByChild("timeStamp").endAt(ttime);
需要一个索引。所以很可能是以下日志语句:
Log.d("TAG", task.getException().getMessage());
产生以下错误消息:
Index not defined, add ".indexOn": "timeStamp", for path "/Posts", to the rules
要解决这个问题,您必须设置以下规则:
{
"rules": {
"Posts": {
".indexOn": "timeStamp",
".read": true,
".write": true
}
}
}
为了让它发挥作用。有了这个索引,您的查询将 return 预期结果和以下代码行:
ds.getRef().removeValue();
将从数据库中删除两者 children。
"Posts" : {
"-MnLFAlhayTv80FxzUfL" : {
"description" : "",
"picture" : "",
"postKey" : "-M",
"timeStamp" : 1635682139495,
"title" : "",
"userId" : "",
"userPhoto" : ""
},
"-MnLFzItc050Sn0EtDho" : {
"description" : "",
"picture" : "",
"postKey" : "-M",
"timeStamp" : 1635682350531,
"title" : "",
"userId" : "b",
"userPhoto" : ""
},
这是我的数据结构。当我尝试像 1635682350531 这样的 long 变量时,我将使用 orderbyChild(timeStamp).endAt() 方法编写一个删除旧 post 的代码 ->> orderbyChild(timeStamp).endAt(1635682350531l);当我将 l 添加到 1635682350531
时它起作用并且我定义了当前时间戳变量并将其放入 endAt 方法,但它不起作用。我可能认为我没有在我的变量中添加“l”?
这是我的代码。
if (UId.equals("k")) {
long tlong = System.currentTimeMillis(); long ttime;
ttime = tlong - 3*24*60*60*1000;
StorageReference picRef = FirebaseStorage.getInstance().getReferenceFromUrl(postImage);
showMessage(String.valueOf(ttime));
picRef.delete()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
//image deleted, now delete database
DatabaseReference db = FirebaseDatabase.getInstance().getReference();
Query queryByTimestamp = db.child("Posts").orderByChild("timeStamp").endAt(ttime);
queryByTimestamp.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
@Override
public void onComplete(@NonNull Task<DataSnapshot> task) {
if (task.isSuccessful()) {
for (DataSnapshot ds : task.getResult().getChildren()) {
ds.getRef().removeValue();
Toast.makeText(PostDetailActivity.this,"게시글이 삭제되었습니다.",Toast.LENGTH_SHORT).show();
}
} else {
Log.d("TAG", task.getException().getMessage());
Toast.makeText(PostDetailActivity.this,"게시글이 삭제되지않았습니다.",Toast.LENGTH_SHORT).show();
}
}
});
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
//failed, can't go further
Toast.makeText(PostDetailActivity.this, "" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
谢谢你回答我。
当您使用以下查询时:
Query queryByTimestamp = db.child("Posts").orderByChild("timeStamp").endAt(ttime);
需要一个索引。所以很可能是以下日志语句:
Log.d("TAG", task.getException().getMessage());
产生以下错误消息:
Index not defined, add ".indexOn": "timeStamp", for path "/Posts", to the rules
要解决这个问题,您必须设置以下规则:
{
"rules": {
"Posts": {
".indexOn": "timeStamp",
".read": true,
".write": true
}
}
}
为了让它发挥作用。有了这个索引,您的查询将 return 预期结果和以下代码行:
ds.getRef().removeValue();
将从数据库中删除两者 children。