从特定于登录用户的 firebase 中提取数据

艾丹史密斯

你知道为什么会出现这个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.firebase.database.DatabaseReference.keepSynced(boolean)' on a null object reference

是不是因为我没有在正确的级别访问数据?

public class contacts extends Fragment {

    EditText contactName, contactPhone;
    Button upload;
    private DatabaseReference databaseReference;
    String userId;
    contact Contact;
    FirebaseDatabase database;
    FirebaseUser user;
    TextView dataReceived;
    Activity context;







    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.contacts, container, false);
    }

    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        contactName = (EditText) getView().findViewById(R.id.nameReg);
        contactPhone = (EditText) getView().findViewById(R.id.phoneReg);
        upload = (Button) getView().findViewById(R.id.buttonReg);
        user = FirebaseAuth.getInstance().getCurrentUser();
        userId = user.getUid();

        databaseReference = FirebaseDatabase.getInstance().getReference().child("phone").child(userId);


        Contact = new contact();
        dataReceived = (TextView) getView().findViewById(R.id.datarecieved);




        upload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        getValues();
                        databaseReference.child("contact").push().setValue(Contact);

                        Toast.makeText(getActivity(),"Data Inserted.....", Toast.LENGTH_LONG).show();
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {
                        Toast.makeText(getActivity(),"Failed" + databaseError, Toast.LENGTH_LONG).show();

                    }
                });
            }
        });

    }


    private void getValues(){
        Contact.setContactName(contactName.getText().toString());
        Contact.setContactPhone(contactPhone.getText().toString());

    }

}

这就是我提取数据的方式:

auth = FirebaseAuth.getInstance();
user= auth.getCurrentUser();
 databaseReference1 = FirebaseDatabase.getInstance().getReference().child("phone").child(user.getUid());
        options1 = new FirebaseRecyclerOptions.Builder<contact>().setQuery(databaseReference1,contact.class).build();
        adapter1 = new FirebaseRecyclerAdapter<contact, contactAdapter>(options1) {
            @Override
            protected void onBindViewHolder(@NonNull final contactAdapter holder, final int position, @NonNull contact model) {
                holder.contactName.setText(model.getContactName());
                holder.contactPhone.setText(model.getContactPhone());
                SharedPreferences prefs =  Home.this.getActivity().getSharedPreferences("check", MODE_PRIVATE);
                String check_state = prefs.getString( "state", "default");
                holder.chk.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if (isChecked) {
                            holder.chk.setChecked(true);
                            for (int i = 0; i < adapter1.getItemCount(); i++) {
                                if (adapter1.getItem(i).isSelected(true)) {
                                    number = ((TextView) holder.itemView.findViewById(R.id.contactPhone)).getText().toString();
                                    Toast.makeText(getActivity(), "Data Inserted....." + number, Toast.LENGTH_SHORT).show();
                                } else {
                                    Toast.makeText(getActivity(), "Error", Toast.LENGTH_LONG).show();
                                }
                            }
                            SharedPreferences.Editor editor = Home.this.getActivity().getSharedPreferences("check", MODE_PRIVATE).edit();
                            editor.putString("state", "true"+String.valueOf(position));
                            editor.apply();
                            adapter1.notifyDataSetChanged();
                        }else {
                            holder.chk.setChecked(false);
                            SharedPreferences.Editor editor =  Home.this.getActivity().getSharedPreferences("check", MODE_PRIVATE).edit();
                            editor.putString("state", "false"+String.valueOf(position));
                            editor.apply();
                            adapter1.notifyDataSetChanged();
                        }
                    }
                });
            }

            @NonNull
            @Override
            public contactAdapter onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                return new contactAdapter(LayoutInflater.from(getActivity()).inflate(R.layout.item_contacts, parent, false));

            }
        };

在此处输入图片说明

电话下方是用户 ID。

  Process: com.example.carcrashdetection, PID: 16924
    java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.firebase.database.DatabaseReference.keepSynced(boolean)' on a null object reference
        at com.example.carcrashdetection.Home.onActivityCreated(Home.java:92)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2614)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:904)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2076)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1866)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1821)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7682)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

哈桑·布塔姆

假设这是数据库:

Phone
|
|---------userID
          -------name:"..."
          -------phone:"..."

并假设您已登录:

public class contacts extends Fragment {

......

//add this

private FirebaseAuth auth;
private FirebaseUser currentUser;


    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

         auth = FirebaseAuth.getInstance();
         currentUser= auth.getCurrentUser();
        return inflater.inflate(R.layout.contacts, container, false);
    }

现在你的数据库是这样的:

databaseReference1 = FirebaseDatabase.getInstance().getReference().child("phone").child(currentUser.getUid());

更新

根据用户的UID保存我告诉你的数据:

当你这样做时,请阅读如下而不是 RecyclerViewAdapter:

public void readDataFromPhones(){

ValueEventListener listener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

      //only the current user can read the data in his/her node
       String name = dataSnapshot.child("contactName").getValue(String.class);
       String phone = dataSnapshot.child("contactPhone").getValue(String.class);



    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // log error
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException());

    }
};
databaseReference1.addValueEventListener(listener);



}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章