2013-07-29 19 views
8

Tôi đang sử dụng Firebase để lưu trữ dữ liệu trên dự án Android và sử dụng Firebase Java API để xử lý dữ liệu. Tôi không chắc chắn rằng tôi đang làm nó hiệu quả nhất có thể, mặc dù, và tôi muốn một số lời khuyên về thực hành tốt nhất để lấy và định dạng dữ liệu. kho Firebase của tôi trông giống như thế này ....Cách tốt nhất để truy xuất/định dạng dữ liệu bằng API Java Firebase

-POLLS 
    NUMPOLLS - 5 
    (pollskey) - NAME - Poll1 
      NUMELECTIONS - 2 
      ELECTIONS 
       (electionskey) - NAME - Election1 
         NUMNOMINATIONS - 2 
         NUMVOTERS - 2 
         NUMBERTOELECT - 1 
         VOTERS - (votesrkey) - NAME - Charles 
             NUMBER - (678) 333-4444 
           . 
           . 
           . 
           (voterskey) - ... 
         NOMINATIONS - (nominationskey) - NAME - Richard Nixon 
               NUMBEROFVOTES - 2 
             . 
             . 
             . 
             (nominationskey) - ... 
      . 
      . 
      . 
      (electionskey) - ... 
    . 
    . 
    . 
    (pollskey) - ... 

Vì vậy, ví dụ ở đây tôi đang cố gắng để có được tất cả dữ liệu ra khỏi một cuộc thăm dò để liệt kê tên bình chọn, đó là tên cuộc bầu cử, và tên thí sinh và số phiếu bầu cho mỗi cuộc bầu cử. Tôi nhận được các cuộc thăm dò cấp DataSnapshot trong OnCreate() chức năng hoạt động chính của tôi như thế này ...

private static final Firebase polls = pollsFirebase.child("Polls"); 
protected void onCreate(Bundle savedInstanceState) { 

     polls.addListenerForSingleValueEvent(new ValueEventListener() { 

      @Override 
      public void onDataChange(DataSnapshot snapshot) { 
       for (DataSnapshot child : snapshot.getChildren()) { 
        if (!child.getName().equals("NumPolls")) { 
         createPollTableAndHeaders(child); 
        } 
       } 

      } 
     }); 
    } 

Sau đó, tôi tiến hành đọc các phần riêng lẻ của dữ liệu tôi cần bằng cách liên tục gọi getValue() trên DataSnapshots, và kiểm tra các phím của kết quả HashMaps ...

private void createPollTableAndHeaders(DataSnapshot poll) { 
    String pollName = ""; 
    int numPolls; 
    Object p = poll.getValue(); 
    if (p instanceof HashMap) { 
     HashMap pollHash = (HashMap) p; 
     if (pollHash.containsKey("Name")) { 
      pollName = (String) pollHash.get("Name"); 
     } 
     if (pollHash.containsKey("Elections")) { 
      HashMap election = (HashMap) pollHash.get("Elections"); 
      Iterator electionIterator = election.values().iterator(); 
      while (electionIterator.hasNext()) { 
       Object electionObj = electionIterator.next(); 
       if (electionObj instanceof HashMap) { 
        HashMap electionHash = (HashMap) electionObj; 
        if (electionHash.containsKey("Name")) { 
         String electionName = (String) electionHash.get("Name"); 
        } 
       } 
      }; 
     } 
    } 

Điều này có vẻ như một cách khá tẻ nhạt để xem chi tiết cấu trúc dữ liệu và tôi tự hỏi liệu có cách nào hay hơn không.

Tôi đã nhìn thấy phương pháp getValue(java.lang.Class<T> valueType) trong tài liệu, nhưng không thể làm cho nó hoạt động trong trường hợp của tôi, vì tôi đang làm việc với các đối tượng sáng tác chứ không chỉ các vùng chứa cho các kiểu nguyên thủy. Làm thế nào để chức năng biết những gì Firebase dữ liệu để gán cho các biến thành viên của một đối tượng mô hình? Có phải nó khớp với các tên khóa Firebase với các biến thành viên và do đó các biến này phải giống hệt nhau, với độ nhạy trường hợp không? Làm thế nào để đối phó với Firebase các tên khóa được tạo ra như được tạo ra khi đẩy đến một số List? Làm thế nào để bạn xây dựng các đối tượng mô hình cho các đối tượng sáng tác?

Trả lời

18

Phương thức getValue(java.lang.Class valueType) tuân theo cùng các quy tắc như thư viện ánh xạ đối tượng jackson (đó là những gì chúng tôi sử dụng nội bộ: http://wiki.fasterxml.com/JacksonInFiveMinutes). Vì vậy, các lớp Java của bạn phải có các hàm tạo mặc định (không có đối số) và getters cho các thuộc tính mà bạn muốn được chỉ định (https://www.firebase.com/docs/java-api/javadoc/com/firebase/client/DataSnapshot.html#getValue(java.lang.Class)). Tóm lại, có, tên khóa trong Firebase phải khớp với các biến thành viên.

Ví dụ sử dụng đối tượng kết hợp, bao gồm danh sách, xem AndroidDrawing. Cụ thể, lớp Segment chứa danh sách các trường hợp Point. Có một lần sử dụng danh sách dữ liệu được tạo bằng phương thức .push(). Vì các tên khóa được tạo ra là các chuỗi để chúng có thể là duy nhất trên các máy khách, chúng deserialize các số Map s chứ không phải là List s. Tuy nhiên, nếu bạn lặp lại trên dataSnapshot.getChildren(), chúng sẽ được trả lại theo thứ tự.

Ngoài ra, nếu bạn không muốn deserialize vào HashMap, bạn có thể sử dụng phương thức child() trên DataSnapshot. Ví dụ:

 

String pollName = poll.child("Name").getValue(String.class); 
DataSnapshot elections = poll.child("Elections"); 
for (DataSnapshot election : elections.getChildren()) { 
    String electionName = election.child("Name").getValue(String.class); 
} 
 

Trong ví dụ này, mọi giá trị không tồn tại sẽ được trả lại là null.

Hy vọng điều đó sẽ hữu ích!

+0

mát nhờ Greg. Hãy cho tôi một vài giờ để về nhà và cố gắng thực hiện theo cách này. Cảm ơn! – MassStrike

+0

Ok tuyệt, đây là tất cả những gì tôi cần để bắt đầu. Cảm ơn Greg, đánh giá cao sự hỗ trợ nhanh chóng. – MassStrike

+0

Xin lỗi để đưa ra một thread cũ, nhưng, tôi đang sử dụng GeoFire cùng với Firebase và lớp Geolocation không cung cấp một constructor mặc định. Vì vậy, làm thế nào tôi nên tiến hành deserialize loại này của lớp học? Có nhà máy deserializer nào được nhúng không? Cảm ơn ! – Leonardo

1

công T getValue (Lớp ValueType)

1.Lớp phải có hàm tạo mặc định không có đối số

2. Lớp phải xác định getters công khai cho thuộc tính được chỉ định. Thuộc tính mà không có một getter công cộng sẽ được thiết lập giá trị mặc định của họ khi một thể hiện được deserialized

Kiểm tra nó từ: this source Nó sẽ giúp bạn

detail

Các vấn đề liên quan