Firebase数据库我的数据没有推送。手动添加子项时出现DatabaseException错误

时间:2018-02-22 17:40:09

标签: android firebase firebase-realtime-database

您好我使用自定义适配器分配我处理firebase对象的方式,然后使用对话框为我的片段分配变量。我需要帮助,因为我分配的数据没有进入我的火力库。我可以问为什么? *编辑添加信息类和数据库模式

我的适配器代码

public class UserTransactionAdapter extends RecyclerView.Adapter<UserTransactionAdapter.ViewHolder> {
private List<Info> mInfo;
private Callback mCallback;
private DatabaseReference userref;


public UserTransactionAdapter(Callback callback) {
    mCallback = callback;
    mInfo = new ArrayList<>();
    userref = FirebaseDatabase.getInstance().getReference().child("Transactions");
    userref.addChildEventListener(new UserChildEventListener());

}

class UserChildEventListener implements ChildEventListener{

    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        Info info = dataSnapshot.getValue(Info.class);
        info.setKey(dataSnapshot.getKey());
        mInfo.add(0,info);
        notifyDataSetChanged();

    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {
        String key = dataSnapshot.getKey();
        Info updatedInfo = dataSnapshot.getValue(Info.class);
        for (Info info : mInfo){
            if (info.getKey().equals(key)){
                info.setValues(updatedInfo);
                notifyDataSetChanged();
                return;
            }
        }

    }

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {
        String key = dataSnapshot.getKey();
        for(Info info: mInfo){
            if (info.getKey().equals(key)){
                mInfo.remove(info);
                break;

            }
        }
        notifyDataSetChanged();

    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.modelinfo, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
    final Info info = mInfo.get(position);
    holder.mNameTextView.setText(info.getName());
    holder.mMonthTextView.setText(info.getMonth());
    holder.mPayTextView.setText(info.getPay());
    holder.mUntilTextView.setText(info.getUntil());
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mCallback.onEdit(info);
        }
    });

}

public void remove(Info info) {
    //TODO: Remove the next line(s) and use Firebase instead
    userref.child(info.getKey()).removeValue();
}


@Override
public int getItemCount() {
    return mInfo.size();
}

public void add(Info info) {
    //TODO: Remove the next line(s) and use Firebase instead
    userref.push().setValue(info);

}

public void update(Info info, String newName,String newMonth,String newPay, String newUntil) {
    //TODO: Remove the next line(s) and use Firebase instead
    info.setName(newName);
    info.setMonth(newMonth);
    info.setPay(newPay);
    info.setUntil(newUntil);
    userref.child(info.getKey()).setValue(info);
}

public interface Callback {
    public void onEdit(Info info);
}

class ViewHolder extends RecyclerView.ViewHolder {
    private TextView mNameTextView;
    private TextView mMonthTextView;
    private TextView mPayTextView;
    private TextView mUntilTextView;

    public ViewHolder(View itemView) {
        super(itemView);
        mNameTextView = (TextView) itemView.findViewById(R.id.nameTxt);
        mMonthTextView = (TextView) itemView.findViewById(R.id.monthTxt);
        mPayTextView = (TextView) itemView.findViewById(R.id.payTxt);
        mUntilTextView = (TextView) itemView.findViewById(R.id.untilTxt);
    }
}

我的片段代码

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    final View view =  inflater.inflate(R.layout.fragment_transaction, container, false);
    FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showAddEditDialog(null);
        }
    });
    mAdapter = new com.google.firebase.ikuzou.database.UserTransactionAdapter(this);
    RecyclerView view1 = (RecyclerView) view.findViewById(R.id.recycler_view);
    view1.setLayoutManager(new LinearLayoutManager(getContext()));
    view1.setHasFixedSize(true);
    view1.setAdapter(mAdapter);
    return view;
}
private void showAddEditDialog(final Info info) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    builder.setTitle(getString(info == null ? R.string.dialog_add_title2 : R.string.dialog_edit_title2));
    View view = getLayoutInflater().inflate(R.layout.dialog_info, null, false);
    builder.setView(view);
    final EditText nameEditText = (EditText) view.findViewById(R.id.nameEditText);
    final EditText monthEditText = (EditText) view.findViewById(R.id.monthEditText);
    final EditText payEditText = (EditText) view.findViewById(R.id.payEditText);
    final EditText untilEditText = (EditText) view.findViewById(R.id.untilEditText);
    if (info != null) {
        // pre-populate
        nameEditText.setText(info.getName());
        monthEditText.setText(info.getMonth());
        payEditText.setText(info.getPay());
        untilEditText.setText(info.getUntil());

        TextWatcher textWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // empty
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // empty
            }

            @Override
            public void afterTextChanged(Editable s) {
                String name = nameEditText.getText().toString();
                String month = monthEditText.getText().toString();
                String pay = payEditText.getText().toString();
                String until = untilEditText.getText().toString();
                mAdapter.update(info, name,month,pay,until );
            }
        };

        nameEditText.addTextChangedListener(textWatcher);
        monthEditText.addTextChangedListener(textWatcher);
        payEditText.addTextChangedListener(textWatcher);
        untilEditText.addTextChangedListener(textWatcher);
    }

    builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (info == null) {
                String name = nameEditText.getText().toString();
                String month = monthEditText.getText().toString();
                String pay = payEditText.getText().toString();
                String until = untilEditText.getText().toString();
                mAdapter.add(new Info(name, month,pay,until));
            }
        }
    });
    builder.setNegativeButton(android.R.string.cancel, null);

    builder.create().show();

我可以知道我的代码上的错误,以便我知道为什么会这样吗?或者也许是因为我还没有创建一个交易节点,这就是为什么会发生这种情况?

修改 我尝试手动添加子节点,现在我正在

  

DatabaseException:无法将java.lang.String类型的对象转换为   类型错误

enter image description here

这是我的信息类代码

public class Info {
private String name,month,pay,until,key;

public Info (){

}

public Info(String name, String month, String pay, String expire) {
    this.name= this.name;
    this.month= this.month;
    this.pay= this.pay;
    this.until= this.until;

}
public String getName(){
    return name;
}
public void setName(String name){
    this.name=name;
}
public String getMonth(){
    return month;
}
public void setMonth(String month){
    this.month=month;
}
public String getPay(){
    return pay;
}
public void setPay(String pay){
    this.pay=pay;
}
public String getUntil(){
    return until;
}
public void setUntil(String until){
    this.until=until;
}
@Exclude
public String getKey(){
    return key;
}
public void setKey(String key){
    this.key = key;
}

public void setValues(Info updatedInfo) {
    this.name=updatedInfo.name;
    this.month=updatedInfo.month;
    this.pay=updatedInfo.pay;
    this.until=updatedInfo.until;
}

我的数据库

enter image description here

3 个答案:

答案 0 :(得分:0)

您添加了一个childEventListner,所有这些功能只有在“事务”节点下添加,删除或更改子项时才会运行。因此,请尝试将子项添加到节点“Transactions”。

根据文档,child_added会为每个现有子项触发一次,然后每次将新子项添加到指定路径时再次触发。

参考:https://firebase.google.com/docs/database/admin/retrieve-data

答案 1 :(得分:0)

userref.child(info.getKey()).setValue(info);

这一行应该是这样的。

userref.child(info.getKey()).push().setValue(info);

答案 2 :(得分:0)

固定IT。我的 Info.class

是一个愚蠢的错误

添加了这个。

public Info(String name, String month, String pay, String expire) {
this.name= this.name;
this.month= this.month;
this.pay= this.pay;
this.until= this.until;

而不是

  this.name= name;
    this.month= month;
    this.pay= pay;
    this.until= until;

所以解决方案就是删除这个并简单地把月,付,直到

现在通过删除

解决问题