Nhận người dùng theo tên tài sản bằng Firebase


129

Tôi đang cố gắng tạo một ứng dụng nơi tôi có thể nhận / đặt dữ liệu trong các tài khoản người dùng cụ thể và tôi đã bị Firebase cám dỗ.

Vấn đề tôi gặp phải là tôi không biết cách nhắm mục tiêu dữ liệu người dùng cụ thể khi cấu trúc của tôi trông như thế này:

Cấu trúc dữ liệu của tôi được mô tả bởi văn bản dưới đây.

online-b-cards
  - users
    - InnROTBVv6FznK81k3m
       - email: "hello@hello"
       - main:  "Hello world this is a text"
       - name:  "Alex"
       - phone: 12912912

Tôi đã nhìn xung quanh và tôi thực sự không thể tìm thấy bất cứ điều gì về cách truy cập dữ liệu cá nhân khi họ được cung cấp một số băm ngẫu nhiên như ID của họ.

Làm thế nào tôi có thể lấy về thông tin người dùng cá nhân dựa trên tên của họ? Nếu có một cách tốt hơn để làm điều này xin vui lòng cho tôi biết!


Câu trả lời:


156

Trước đây, Firebase yêu cầu bạn tạo các chỉ mục của riêng mình hoặc tải xuống tất cả dữ liệu tại một vị trí để tìm và truy xuất các phần tử khớp với một số thuộc tính con (ví dụ: tất cả người dùng có name === "Alex").

Vào tháng 10 năm 2014, Firebase đã triển khai chức năng truy vấn mới thông qua orderByChild()phương thức, cho phép bạn thực hiện loại truy vấn này một cách nhanh chóng và hiệu quả. Xem câu trả lời cập nhật dưới đây.


Khi ghi dữ liệu vào Firebase, bạn có một vài tùy chọn khác nhau sẽ phản ánh các trường hợp sử dụng khác nhau. Ở mức cao, Firebase là một kho lưu trữ dữ liệu NoQuery có cấu trúc hình cây và cung cấp một vài nguyên hàm đơn giản để quản lý danh sách dữ liệu:

  1. Viết thư cho Firebase bằng một khóa duy nhất, đã biết:

    ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
    
  2. Nối vào danh sách với khóa được tạo tự động sẽ tự động sắp xếp theo thời gian được viết:

    ref.child('users').push({ "first_name": "rob", "age": 28 })
    
  3. Lắng nghe những thay đổi trong dữ liệu theo đường dẫn duy nhất, đã biết của nó:

    ref.child('users').child('123').on('value', function(snapshot) { ... })
    
  4. Lọc hoặc sắp xếp dữ liệu trong danh sách theo khóa hoặc giá trị thuộc tính :

    // Get the last 10 users, ordered by key
    ref.child('users').orderByKey().limitToLast(10).on('child_added', ...)
    
    // Get all users whose age is >= 25
    ref.child('users').orderByChild('age').startAt(25).on('child_added', ...)
    

Với việc bổ sung orderByChild(), bạn không còn cần phải tạo chỉ mục của riêng mình cho các truy vấn trên các thuộc tính con! Ví dụ: để truy xuất tất cả người dùng có tên "Alex":

ref.child('users').orderByChild('name').equalTo('Alex').on('child_added',  ...)

Kỹ sư tại Firebase ở đây. Khi ghi dữ liệu vào Firebase, bạn có một vài tùy chọn khác nhau sẽ phản ánh các trường hợp sử dụng ứng dụng khác nhau. Vì Firebase là kho lưu trữ dữ liệu NoQuery, bạn sẽ cần lưu trữ các đối tượng dữ liệu của mình bằng các khóa duy nhất để bạn có thể truy cập trực tiếp vào mục đó hoặc tải tất cả dữ liệu tại một vị trí cụ thể và lặp qua từng mục để tìm nút bạn đang tìm kiếm . Xem Viết dữ liệuquản lý danh sách để biết thêm thông tin.

Khi bạn ghi dữ liệu trong Firebase, bạn có thể setsử dụng dữ liệu bằng một đường dẫn duy nhất, được xác định (nghĩa là a/b/c) hoặc pushdữ liệu vào một danh sách, sẽ tạo ra một id duy nhất (nghĩa là a/b/<unique-id>) và cho phép bạn sắp xếp và truy vấn các mục trong danh sách đó theo thời gian . Id duy nhất mà bạn nhìn thấy ở trên được tạo bằng cách gọi pushđể nối thêm một mục vào danh sách tại online-b-cards/users.

Thay vì sử dụng pushở đây, tôi khuyên bạn nên sử dụng setvà lưu trữ dữ liệu cho mỗi người dùng bằng một khóa duy nhất, chẳng hạn như địa chỉ email của người dùng. Sau đó, bạn có thể truy cập trực tiếp vào dữ liệu của người dùng bằng cách điều hướng online-b-cards/users/<email>qua SDK Firebase JS. Ví dụ:

function escapeEmailAddress(email) {
  if (!email) return false

  // Replace '.' (not allowed in a Firebase key) with ',' (not allowed in an email address)
  email = email.toLowerCase();
  email = email.replace(/\./g, ',');
  return email;
}

var usersRef = new Firebase('https://online-b-cards.firebaseio.com/users');
var myUser = usersRef.child(escapeEmailAddress('hello@hello.com')) 
myUser.set({ email: 'hello@hello.com', name: 'Alex', phone: 12912912 });

Lưu ý rằng vì Firebase không cho phép một số ký tự nhất định trong tài liệu tham khảo (xem Tạo tài liệu tham khảo ), chúng tôi xóa .và thay thế nó bằng ,mã trong phần trên.


1
@RobDiMarco Bạn có câu trả lời cho câu hỏi được đăng dưới đây bởi Stephen không?
Charles Han

2
Này @RobDiMarco. Mặc dù đề xuất của bạn sử dụng địa chỉ email làm cơ sở cho id vẫn hợp lệ, nhưng có thể đáng để mở rộng câu trả lời của bạn để trỏ đến orderByChildtính năng mới . Cho rằng câu trả lời này xuất hiện khá thường xuyên như một câu trả lời có liên quan / liên quan, mọi người buộc phải xem nó và nên biết về các tính năng truy vấn mới.
Frank van Puffelen

1
@FrankvanPuffelen Ý tưởng tuyệt vời - cảm ơn bạn đã lưu ý. Tôi sẽ nhận được cập nhật này ngày hôm nay.
Rob DiMarco

1
@Ced Thật không may, tôi không thể nhận xét về những gì trong tác phẩm. Tôi hứa rằng chúng tôi làm việc chăm chỉ (điều đó luôn đúng), nhưng không thể đưa ra chi tiết cụ thể. API cơ sở dữ liệu thực sự bị hạn chế theo một số cách và chúng tôi cố tình làm điều này để chỉ đưa ra các phương thức mà chúng tôi có thể đảm bảo mức hiệu suất nhất định. Đây là lý do tại sao chúng tôi không đưa ra một phương pháp để chạy một hoạt động trên toàn bộ danh sách, ví dụ. Điểm công bằng trên các tài liệu cho người dùng nâng cao. Khi nghi ngờ, hãy thử Nhóm Google của chúng tôi để biết các cuộc trò chuyện chi tiết: Groups.google.com/forum/#!forum/firebase-talk Nhóm rất tích cực ở đây!
Rob DiMarco

1
@RobDiMarco Thật tuyệt khi nghe điều đó. Tôi đã thấy các chức năng của Firebase ngày hôm qua, và đã bị thổi phồng cả ngày vì tôi nghĩ Firebase là một công cụ thay đổi trò chơi và sắp sửa cách mạng hóa back-end. Nghiêm túc mà nói, tôi có thể dạy một người chưa bao giờ mã hóa trong đời mình để duy trì phần phụ trợ trên Firebase. Điều đó khá tuyệt vời và khá đáng sợ. Chúc mừng
Ced

5

Bạn có thể lấy các chi tiết bằng mã sau đây.

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("users");
myRef.orderByChild("name").equalTo("Alex").addListenerForSingleValueEvent(new ValueEventListener() {           
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {
                        Log.d(TAG, "PARENT: "+ childDataSnapshot.getKey());
                        Log.d(TAG,""+ childDataSnapshot.child("name").getValue()); 
                    }

4

Tôi nghĩ cách tiếp cận tốt nhất là xác định id của người dùng dựa trên o đối tượng auth do Firebase cung cấp. Khi tôi tạo người dùng của mình, tôi làm:

FirebaseRef.child('users').child(id).set(userData);

Id này đến từ:

var ref = new Firebase(FIREBASE);
var auth = $firebaseAuth(ref);
auth.$authWithOAuthPopup("facebook", {scope: permissions}).then(function(authData) {
    var userData = {}; //something that also comes from authData
    Auth.register(authData.uid, userData);
}, function(error) {
    alert(error);
});

Các dịch vụ xác thực Firebase sẽ luôn đảm bảo một id duy nhất trong số tất cả các nhà cung cấp của họ được đặt ở uid. Bằng cách này, bạn sẽ luôn có auth.uid và có thể dễ dàng truy cập người dùng mong muốn để cập nhật nó, như:

FirebaseRef.child('users').child(id).child('name').set('Jon Snow');

2

Đây là một diễn giải của một bài đăng đã giúp tôi khi cố gắng truy cập id duy nhất được tạo tự động. Truy cập id duy nhất Firebase trong ng-repeat bằng cách sử dụng đồng bộ ẩn angularFire

Cảm ơn, bennlich (nguồn):

Firebase hoạt động như một đối tượng javascript bình thường. Có lẽ ví dụ dưới đây có thể giúp bạn đi đúng hướng.

<div ng-repeat="(name, user) in users">
    <a href="" ng-href="#/{{name}}">{{user.main}}</a>
</div>

Chỉnh sửa: Không chắc chắn 100% về kết quả mong muốn của bạn, nhưng đây là một chút nữa có thể gây ra khoảnh khắc 'aha'. Nhấp vào khóa mà bạn đang cố truy cập ngay trong bảng điều khiển Firebase của bạn. Từ đó bạn có thể sử dụng một cái gì đó như:

var ref = new Firebase("https://online-b-cards.firebaseio.com/users/<userId>/name);
    ref.once('value', function(snapshot) {
        $scope.variable= snapshot.val();
});

Xin chào Anthony, cảm ơn bạn vì đã cung cấp thông tin cho cấu trúc REST (?) Và nó chắc chắn đã gây ra một 'aha'. Bây giờ nhìn lại bài đăng này, tôi thấy rõ rằng tôi đã cấu trúc dữ liệu của mình một cách hơi khó xử, cảm ơn vì những lời khuyên và tôi sẽ ghi nhớ nó cho dự án dựa trên căn cứ hỏa lực tiếp theo của tôi!
Richard Bamford

2

Đây là cách truy cập các khóa duy nhất được tạo tự động trong Firebase: cấu trúc dữ liệu : - OnlineBcards - UniqueKey

database.ref().on("value", function(snapshot) {
      // storing the snapshot.val() in a variable for convenience
      var sv = snapshot.val();
      console.log("sv " + sv); //returns [obj obj]

      // Getting an array of each key in the snapshot object
      var svArr = Object.keys(sv);
      console.log("svArr " + svArr); // [key1, key2, ..., keyn]
      // Console.log name of first key
      console.log(svArr[0].name);
}, function(errorObject) {
  console.log("Errors handled: " + errorObject.code);
});

1

Cách đơn giản nhất là ngừng sử dụng .push(){}

Hàm sẽ tạo khóa ngẫu nhiên đó. Nhưng thay vào đó hãy sử dụng .update(){}chức năng nơi bạn có thể chỉ định tên của đứa trẻ thay vì có khóa ngẫu nhiên.


1

Lấy dữ liệu:

Trong cơ sở dữ liệu của bạn, bạn đang sử dụng một id ngẫu nhiên được tạo bằng cách sử dụng push(), do đó nếu bạn muốn truy xuất dữ liệu thì hãy làm như sau:

Sử dụng Firebase trong ứng dụng Android:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users");
ref.addListenerForSingleValueEvent(new ValueEventListener() {           
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                for (DataSnapshot datas : dataSnapshot.getChildren()) {
                    String name=datas.child("name").getValue().toString();
                }
             }

            @Override
           public void onCancelled(DatabaseError databaseError) {
          }
     });

Sử dụng Firebase trong Javascript:

  firebase.database().ref().child("users").on('value', function (snapshot) {
   snapshot.forEach(function(childSnapshot) {
    var name=childSnapshot.val().name;
  });
});

Tại đây bạn có ảnh chụp nhanh (vị trí của dữ liệu) userssau đó bạn lặp bên trong tất cả các id ngẫu nhiên và truy xuất tên.


Lấy dữ liệu cho một người dùng cụ thể:

Bây giờ nếu bạn chỉ muốn truy xuất thông tin cho một người dùng cụ thể, thì bạn cần thêm một truy vấn:

Sử dụng Firebase trong ứng dụng Android:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users");
Query queries=ref.orderByChild("name").equalTo("Alex");
queries.addListenerForSingleValueEvent(new ValueEventListener() {...}

Sử dụng Firebase với Javascript

firebase.database().ref().child("users").orderByChild("name").equalTo("Alex").on('value', function (snapshot) {
   snapshot.forEach(function(childSnapshot) {
      var name=childSnapshot.val().name;
   });
});

Sử dụng orderByChild("name").equalTo("Alex")giống như nói where name="Alex"vậy nó sẽ lấy dữ liệu liên quan đến Alex.


Cách tốt nhất:

Điều tốt nhất là sử dụng Xác thực Firebase, do đó tạo một id duy nhất cho mỗi người dùng và sử dụng nó thay vì một id ngẫu nhiên push(), theo cách này bạn không phải lặp qua tất cả người dùng vì bạn có id và có thể dễ dàng truy cập.

Đầu tiên, người dùng cần phải đăng nhập, sau đó bạn có thể truy xuất id duy nhất và đính kèm một trình nghe để lấy dữ liệu khác của người dùng đó:

Sử dụng Firebase với Android:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("users");
String uid = FirebaseAuthentication.getInstance().getCurrentUser().getUid();

ref.child(uid).addListenerForSingleValueEvent(new ValueEventListener() {
          @Override
         public void onDataChange(DataSnapshot dataSnapshot) { 
           String name=dataSnapshot.child("name").getValue().toString(); 
   }
         @Override
       public void onCancelled(DatabaseError databaseError) {
      }
 });

Sử dụng Firebase với Javascript:

    var user = firebase.auth().currentUser;
    var uid=user.uid;

    firebase.database().ref().child("users").child(uid).on('value', function (snapshot) {
     var name=snapshot.val().name;
   });
 

0

Cách đơn giản nhất và tốt hơn để thêm Id duy nhất vào cơ sở dữ liệu của bạn theo người dùng được xác thực là:

private FirebaseAuth auth;

String UId=auth.getCurrentUser().getUid();

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("Users");

User user = new User(name,email,phone,address,dob,bloodgroup);

myRef.child(UId).setValue(user);

UId sẽ là Id duy nhất cho email / người dùng được xác thực cụ thể


3
Điều đó không giải quyết câu hỏi. Câu hỏi là làm thế nào để có được và thiết lập dữ liệu trong các tài khoản người dùng cụ thể. Mã của bạn tạo một tài khoản người dùng và thực sự không hợp lệ vì không thể .setValue (người dùng) của bạn vì người dùng không phải là một tham số hợp lệ.
Jay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.