База данных Firebase - как обеспечить уникальность значений перед отправкой в ​​базу данных, если каждое значение имеет случайно сгенерированный ключ - PullRequest
0 голосов
/ 25 апреля 2018

Я использую Android SDK для записи токенов устройства в мою базу данных Firebase.Я связываю эти токены с пользователями.Я предполагаю, что у каждого пользователя может быть одно или несколько устройств.Следовательно, вот как выглядит моя текущая структура базы данных:

{
  "users" : {
    "1" : {
      "-LAwu8VKATAxifCOZIPn" : "Device_Token_For_User_1",
      "-LAwyfXcoLcXBX3rOshb" : "Device_Token_For_User_1"
    },
    "8" : {
      "-LAwuR9cel-p0kXv-LCn" : "Device_Token_For_User_8"
    }
  }
}

Как видите, пользователь 1 (представленный ключом «1») содержит тот же токен, который был записан дважды, но с разными ключами (левая сторона).Эти ключи генерируются случайным образом из-за метода push().На самом деле я забочусь только о самих значениях, но я хочу избежать записи одного и того же токена конкретному пользователю более одного раза.

Я помещаю токены в свою базу данных в базу данных Firebase следующим образом:

String token = FirebaseInstanceId.getInstance().getToken();
Person currentUser;
try {
    currentUser = Reservoir.get("current_user", Person.class);
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference();
    myRef.child("users").child(Integer.toString(currentUser.id)).push().setValue(token);
} catch (IOException e) {
    Log.e("ERROR", "Cannot fetch user from reservoir.");
    Toast.makeText(getApplicationContext(), "An unexpected error occurred.", Toast.LENGTH_SHORT).show();
    e.printStackTrace();
}

Все хорошо, за исключением того, что когда пользователь выходит из системы и входит обратно на одно и то же устройство, один и тот же токен будет дважды отправлен в базу данных, что и произошло с Пользователем 1.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Вместо использования токена в качестве значения вы можете использовать его в качестве ключа, чтобы гарантировать его уникальность и присвоить ему произвольное значение, подобное true.

Вам придется изменить свой код следующим образом:

myRef.child("users").child(Integer.toString(currentUser.id)).child(token).setValue(true);

Это приведет к следующей базе данных:

{
  "users" : {
    "1" : {
      "Device_Token_For_User_1" : true,
      "SecondDevice_Token_For_User_1" : true
    },
    "8" : {
      "Device_Token_For_User_8" : true
    }
  }
}
0 голосов
/ 25 апреля 2018

Лучше использовать userido, тогда вы можете проверить, существует ли токен в базе данных, если он не существует, то вы можете добавить его в базу данных.

String token = FirebaseInstanceId.getInstance().getToken();
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference();
FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();

myRef.orderByChild(user.getUid()).equalTo(token).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(!dataSnapshot.exists()){
               myRef.child("users").child(user.getUid()).setValue(token);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...