初始化可以放入数据库的对象数

时间:2018-02-03 06:42:57

标签: java android arrays firebase-realtime-database

我正在构建一个应用程序,它将添加紧急联系人,但必须严格为每个用户可以成为紧急联系人的10人,如果超过该数量,则必须告诉用户他/她的紧急联系人是完整的,问题我不知道如何设置允许的值

public class EmergencyList extends AppCompatActivity {

private Toolbar mToolbar;

private TextView mProfileName, mProfileStatus, mProfileFriendsCount;
private Button mProfileSendReqBtn, mDeclineBtn;

private DatabaseReference mUsersDatabase;

private ProgressDialog mProgressDialog;

private DatabaseReference mFriendReqDatabase;
private DatabaseReference mFriendDatabase;
private DatabaseReference mNotificationDatabase;
private ImageView mProfileImage;


private DatabaseReference mRootRef;

private FirebaseUser mCurrent_user;

private String mCurrent_state;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_emergency_list);

    mToolbar = (Toolbar)findViewById(R.id.user_Appbar);
    setSupportActionBar(mToolbar);
    getSupportActionBar().setTitle("Who to notify in emergency");
    mToolbar.setTitleTextColor(android.graphics.Color.WHITE);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    final String user_id = getIntent().getStringExtra("user_id");


    mRootRef = FirebaseDatabase.getInstance().getReference();

    mUsersDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(user_id);
    mFriendReqDatabase = FirebaseDatabase.getInstance().getReference().child("Connection_req");
    mFriendDatabase = FirebaseDatabase.getInstance().getReference().child("Emergency_Contacts");
    mNotificationDatabase = FirebaseDatabase.getInstance().getReference().child("Emergency_Notification");
    mCurrent_user = FirebaseAuth.getInstance().getCurrentUser();




    mProfileImage = (ImageView) findViewById(R.id.profile_image);
    mProfileName = (TextView) findViewById(R.id.profile_displayName);
    mProfileStatus = (TextView) findViewById(R.id.profile_status);
    mProfileFriendsCount = (TextView) findViewById(R.id.profile_totalFriends);
    mProfileSendReqBtn = (Button) findViewById(R.id.profile_send_req_btn);
    mDeclineBtn = (Button) findViewById(R.id.profile_decline_btn);


    mCurrent_state = "not_emergency_contact";

    mDeclineBtn.setVisibility(View.INVISIBLE);
    mDeclineBtn.setEnabled(false);


    mProgressDialog = new ProgressDialog(this);
    mProgressDialog.setTitle("Loading User Data");
    mProgressDialog.setMessage("Please wait while we load the user data.");
    mProgressDialog.setCanceledOnTouchOutside(false);
    mProgressDialog.show();



    mUsersDatabase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            String display_name = dataSnapshot.child("name").getValue().toString();
            String status = dataSnapshot.child("status").getValue().toString();
            String image = dataSnapshot.child("profile_picture").getValue().toString();

            mProfileName.setText(display_name);
            mProfileStatus.setText(status);

            Picasso.with(EmergencyList.this).load(image).placeholder(R.drawable.my_profile).into(mProfileImage);

            if(mCurrent_user.getUid().equals(user_id)){

                mDeclineBtn.setEnabled(false);
                mDeclineBtn.setVisibility(View.INVISIBLE);

                mProfileSendReqBtn.setEnabled(false);
                mProfileSendReqBtn.setVisibility(View.INVISIBLE);

            }


            //--------------- FRIENDS LIST / REQUEST FEATURE -----

            mFriendReqDatabase.child(mCurrent_user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    if(dataSnapshot.hasChild(user_id)){

                        String req_type = dataSnapshot.child(user_id).child("emergency_type").getValue().toString();

                        if(req_type.equals("received")){

                            mCurrent_state = "emergency_received";
                            mProfileSendReqBtn.setText("Accept As Emergency ");

                            mDeclineBtn.setVisibility(View.VISIBLE);
                            mDeclineBtn.setEnabled(true);


                        } else if(req_type.equals("sent")) {

                            mCurrent_state = "emergency_sent";
                            mProfileSendReqBtn.setText("Cancel Emergency Request");

                            mDeclineBtn.setVisibility(View.INVISIBLE);
                            mDeclineBtn.setEnabled(false);

                        }

                        mProgressDialog.dismiss();


                    } else {


                        mFriendDatabase.child(mCurrent_user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {

                                if(dataSnapshot.hasChild(user_id)){

                                    mCurrent_state = "emergency_contact";
                                    mProfileSendReqBtn.setText("Remove "+mProfileName.getText() + " As Emergency Contact");

                                    mDeclineBtn.setVisibility(View.INVISIBLE);
                                    mDeclineBtn.setEnabled(false);

                                }

                                mProgressDialog.dismiss();

                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                                mProgressDialog.dismiss();

                            }
                        });

                    }



                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });


        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });


    mProfileSendReqBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            mProfileSendReqBtn.setEnabled(false);

            // --------------- NOT FRIENDS STATE ------------

            if(mCurrent_state.equals("not_emergency_contact")){


                DatabaseReference newNotificationref = mRootRef.child("Emergency_Notification").child(user_id).push();
                String newNotificationId = newNotificationref.getKey();

                HashMap<String, String> notificationData = new HashMap<>();
                notificationData.put("from", mCurrent_user.getUid());
                notificationData.put("type", "request");

                Map requestMap = new HashMap();
                requestMap.put("Connection_req/" + mCurrent_user.getUid() + "/" + user_id + "/emergency_type", "sent");
                requestMap.put("Connection_req/" + user_id + "/" + mCurrent_user.getUid() + "/emergency_type", "received");
                requestMap.put("Emergency_Notifications/" + user_id + "/" + newNotificationId, notificationData);

                mRootRef.updateChildren(requestMap, new DatabaseReference.CompletionListener() {
                    @Override
                    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {

                        if(databaseError != null){

                            Toast.makeText(EmergencyList.this, "There was some error in sending request", Toast.LENGTH_SHORT).show();

                        } else {

                            mCurrent_state = "emergency_sent";
                            mProfileSendReqBtn.setText("Cancel Emergency Contact");

                        }

                        mProfileSendReqBtn.setEnabled(true);


                    }
                });

            }


            // - -------------- CANCEL REQUEST STATE ------------

            if(mCurrent_state.equals("emergency_sent")){

                mFriendReqDatabase.child(mCurrent_user.getUid()).child(user_id).removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {

                        mFriendReqDatabase.child(user_id).child(mCurrent_user.getUid()).removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {


                                mProfileSendReqBtn.setEnabled(true);
                                mCurrent_state = "not_emergency_contact";
                                mProfileSendReqBtn.setText("Add As Emergency Contact");

                                mDeclineBtn.setVisibility(View.INVISIBLE);
                                mDeclineBtn.setEnabled(false);


                            }
                        });

                    }
                });

            }


            // ------------ REQ RECEIVED STATE ----------

            if(mCurrent_state.equals("emergency_received")){

                final String currentDate = DateFormat.getDateTimeInstance().format(new Date());

                Map friendsMap = new HashMap();
                friendsMap.put("Emergency_Contact/" + mCurrent_user.getUid() + "/" + user_id + "/date", currentDate);
                friendsMap.put("Emergency_Contact/" + user_id + "/"  + mCurrent_user.getUid() + "/date", currentDate);


                friendsMap.put("Connection_req/" + mCurrent_user.getUid() + "/" + user_id, null);
                friendsMap.put("Connection_req/" + user_id + "/" + mCurrent_user.getUid(), null);


                mRootRef.updateChildren(friendsMap, new DatabaseReference.CompletionListener() {
                    @Override
                    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {


                        if(databaseError == null){

                            mProfileSendReqBtn.setEnabled(true);
                            mCurrent_state = "emergency_contact";
                            mProfileSendReqBtn.setText("Remove " + mProfileName.getText() + " As Emergency Contact");

                            mDeclineBtn.setVisibility(View.INVISIBLE);
                            mDeclineBtn.setEnabled(false);

                        } else {

                            String error = databaseError.getMessage();

                            Toast.makeText(EmergencyList.this, error, Toast.LENGTH_SHORT).show();


                        }

                    }
                });

            }


            // ------------ UNFRIENDS ---------

            if(mCurrent_state.equals("emergency_contact")){

                Map unfriendMap = new HashMap();
                unfriendMap.put("Emergency_Contact/" + mCurrent_user.getUid() + "/" + user_id, null);
                unfriendMap.put("Emergency_Contact/" + user_id + "/" + mCurrent_user.getUid(), null);

                mRootRef.updateChildren(unfriendMap, new DatabaseReference.CompletionListener() {
                    @Override
                    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {


                        if(databaseError == null){

                            mCurrent_state = "not_emergency_contact";
                            mProfileSendReqBtn.setText("Add As Emergency Contact");

                            mDeclineBtn.setVisibility(View.INVISIBLE);
                            mDeclineBtn.setEnabled(false);

                        } else {

                            String error = databaseError.getMessage();

                            Toast.makeText(EmergencyList.this, error, Toast.LENGTH_SHORT).show();


                        }

                        mProfileSendReqBtn.setEnabled(true);

                    }
                });

            }


        }
    });


}


}

有关如何仅添加有限数量的人作为紧急联系人的任何建议以及何时超过该数字以返回紧急联系人已满的消息?

1 个答案:

答案 0 :(得分:0)

要解决这个问题,实际上有三种方法。

一种方式是客户端,为此,我建议您在要存储最多10个联系人的节点上附加一个侦听器,并在getChildrenCount()对象上使用DataSnapshot方法。然后只使用if语句:

if(dataSnapshot.getChildrenCount() <= 10) {
    //Add contact
} else {
    Log.d("TAG", "The maximum number of contacts has been reached!");
}

第二种方法是使用Firebase Security Rules限制可以写入特定路径的记录数。 SOF上有一些关于这种方法的帖子,为此我建议你看看加藤&#39;回答post

第三种方法是在Firebase Could Function中编写一个函数,帮助您在将第一个或第11个联系人写入特定路径后将其删除。

因此,根据您的需求,您可以选择这三种解决方案中哪一种最适合您的应用。