如何在Firebase中不使用.push()来避免覆盖?使用自动增量生成ID以替换.push()

时间:2016-11-11 09:32:11

标签: android firebase firebase-realtime-database

我尝试生成ID(自动增量)来替换唯一ID。有人可以帮我解决这个问题吗?谢谢!

public void SignUp(){

    int UserCount = 1;
    String identifier ="User" + UserCount;
    Firebase userRef = firebaseRef.child("Users");
    EditText nameInput = (EditText) findViewById(R.id.nameTxt);
    String name = nameInput.getText().toString();

    EditText passInput = (EditText) findViewById(R.id.passwordTxt);
    String password = passInput.getText().toString();

    EditText addrInput = (EditText) findViewById(R.id.addressTxt);
    String address = addrInput.getText().toString();
    if (!name.equals("")){
        Map<String, String> infor= new HashMap<String, String>();
        caloocan.put("Usersname", name);
        caloocan.put("Userspassword", password);
        caloocan.put("Usersaddress", address);

        Map<String, Map<String, String>> users = new HashMap<String, Map<String, String>>();
        users.put(identifier,infor);

        userRef.setValue(users);
        UserCount++;
    }
}

Unique ID which is generated by Firebase

Generate the ID by using auto-increment just like I'm using in SQL database

2 个答案:

答案 0 :(得分:1)

如果您真的想避免使用push()方法,那么您需要在设置值之前从数据库中检索所有用户。

以下是如何做到的

userRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        int count = dataSnapshot.getChildrenCount() + 1;
        String identifier = "User" + count;

        // save the new user
        userRef.setValue( ... );
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

答案 1 :(得分:0)

你可以试试这个:

final DatabaseReference firebaseRef = FirebaseDatabase.getInstance().getReference();
final DatabaseReference mCounterRef = firebaseRef.child("counter");
// listen for single change
mCounterRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        // getValue() returns Long
        long count = (long) dataSnapshot.child("Users").getValue();

        System.out.println("count before setValue()=" + count);

        mCounterRef.child("count").setValue(++count);  // <= Change to ++count

        System.out.println("count after setValue()=" + count);

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // throw an error if setValue() is rejected
        throw databaseError.toException();
    }
});

如果应用程序在运行时崩溃,那么您应该添加此部分:

mCounterRef.child("users").setValue(++count, new 
    DatabaseReference.CompletionListener() {
        @Override
        public void onComplete(DatabaseError databaseError,
                           DatabaseReference databaseReference) {
            if (databaseError != null) {
                System.out.println("Error: " + databaseError.getMessage());
            }
        }
    });