【问题标题】:Android Firebase delete crash application on remove valueAndroid Firebase 在删除值时删除崩溃应用程序
【发布时间】:2017-11-01 12:53:57
【问题描述】:

我也想从 firebase 中删除列表视图中的数据。

 lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, final View view, final int position, long id) {
            mDatabaseRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                       DatabaseReference s =snapshot.getRef();
                        mDatabaseRef.child(String.valueOf(s)).removeValue();
                    }
                }

应用程序在此行崩溃:mDatabaseRef.child(String.valueOf(s)).removeValue(); 我也用setValue(null);

【问题讨论】:

  • 请同时发布日志。
  • 不加登录
  • 当我添加 mDatabaseRef.child(somthing).removeValue();应用崩溃
  • com.google.firebase.database.DatabaseException:Firebase 数据库路径无效:booklive-a10ff.firebaseio.com/Hamza/-KxreDZ3efR4XZHTZ3Vz。 Firebase 数据库路径不得在处包含“.”、“#”、“$”、“[”或“]”
  • 请edit your question 提供有关您要实现的目标和 logcat 堆栈跟踪的更多详细信息。

标签: java android listview firebase firebase-realtime-database


【解决方案1】:

要真正从 Firebase 数据库中删除子项,您需要将 String 作为参数传递给 child() 方法,该参数表示数据库中位于特定位置的键。

snapshot.getRef() 实际上返回您已附加侦听器的位置的完整引用。

String.valueOf(s) 返回引用的String 表示。为了删除一个值,您需要使用实际的字符串。

让我们举个例子。你有以下路径:

Firebase-root/users/uid/name

其中 name 的值为 John。要删除name,您需要使用以下代码行:

FirebaseDatabase.getInstance().getReference()
    .child("users")
    .child("uid")
    .child("name")
    .removeValue();

而不是这行代码:

FirebaseDatabase.getInstance().getReference()
    .child("users")
    .child("uid")
    .child("Firebase-root/users/uid/name")
    .removeValue();

这是您尝试对代码执行的操作。

根据您的新更新,为了删除该记录,当您推送该随机密钥时,您首先需要将该密钥存储在一个变量中,如下所示:

String key = yourRef.push().getKey(); //Store the pushed key
FirebaseDatabase.getInstance().getReference()
    .child("Hamza")
    .child(key)
    .removeValue();

【讨论】:

  • 因理解了一个恶魔般的问题而被投票赞成。答案也很好!
  • 但在此如何获取单个值
  • 为了删除记录,您需要知道要删除的元素。这里没有getting操作。
  • 我添加了图片,其中我描述了我要删除的记录请帮助
  • 使用此行:FirebaseDatabase.getInstance().getReference() .child("Hamza") .child("-KxrixE-JDgIB3E0FDF7") .removeValue();您的记录现在被删除了吗?
【解决方案2】:

它崩溃了,因为您没有告诉fire-base 要删除什么,要删除子节点,您必须告诉fire-base 您要删除该节点,请提及.Child("hamza"),然后提及您要删除的子节点和如果你想删除 hamza 节点然后将它传递给 hamza 作为键。首先获取该值然后删除它,如果你使用列表视图然后从 object 或 array 获取它的 id 你正在传递什么.!如果您不知道该对象的键,您所要做的就是查询,然后使用 getKey() 方法从 DataSnapshot 获取该对象键,例如 postsnapshot.getKey()。这里 uid 是您的那个孩子的键想删除!

尝试像这样实现model class

class model {
private String name;
private String id;
private String url;

}

    mListView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            Object obj = mListView.getAdapter().getItem(position);
           function(objct.getkey());

        }
    });

private void function(String uid){

mdatabaseReference.child("hamza").orderByKey().equalTo(uid).addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {

      for (DataSnapshot postsnapshot :dataSnapshot.getChildren()) {

        String key = postsnapshot.getKey();
        dataSnapshot.getRef().removeValue();

     }
}

【讨论】:

  • 对象 uid = lv.getAdapter().getItem(position);这是你告诉的uid吗?
  • 函数(objct.getkey());什么是对象?
  • 请同时发布您的适配器代码。!您是在其中使用对象列表还是只是简单的数组列表。?
  • key 是你对象的 id ..也就是 Kxrixe-jDg...!
【解决方案3】:
public class ImageListAdapter extends ArrayAdapter<ImageUpload> {
private Activity context;
private int resource;
private List<ImageUpload> listImage;


public ImageListAdapter(@NonNull Activity context, @LayoutRes int resource, @NonNull List<ImageUpload> objects) {
    super(context, resource, objects);
    this.context = context;
    this.resource = resource;
    listImage = objects;
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    LayoutInflater inflater = context.getLayoutInflater();

    View v = inflater.inflate(resource, null);
    TextView tvName = (TextView) v.findViewById(tvImageName);
    ImageView img = (ImageView) v.findViewById(R.id.imgView);

    tvName.setText(listImage.get(position).getName());
    Glide.with(context).load(listImage.get(position).getUrl()).into(img);

    return v;

}

【讨论】:

猜你喜欢
  • 2018-05-27
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
  • 2020-01-19
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多