我曾經使用這樣的地圖決議 dataSnapshotsMap<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
但是當我在 YouTube 上觀看教程時,我看到那個人使用這樣的類決議 dataSnapshot User user = dataSnapshot.getValue(User.class);,現在我有很多問題。
這是如何運作的?
我的意思是,如果類 User 的成員與快照不同,它會給我們一個錯誤嗎?
例如
snapshot:
-User
|-Name:jojo
|-Age:19
User Class fields:
boolean a;
float x;
int c;
如果 User 類的欄位的推桿順序與快照上的不同并且大小寫不同,或者該類缺少一個欄位怎么辦?
我的第二個問題的例子:
snapshot:
-User
|-Name:jojo
|-Age:19
User Class fields:
int age;
String name;
我已閱讀 firebase 檔案 https://firebase.google.com/docs/reference/android/com/google/firebase/database/DataSnapshot#getValue(java.lang.Class) 但它沒有回答我的兩個問題它只是說這個類必須有一個空的建構式和每個欄位的getter
編輯:
snapshot:
-User
|-Followers
|-id:xxxxxx
|-id:xxxxxx
|-Name:jojo
|-Age:19
User Class fields:
int age;
String name;
uj5u.com熱心網友回復:
Firebase 嘗試使用 JavaBean 命名約定在來自資料庫的 JSON 資料中的屬性與您的類中的屬性之間進行映射。映射到資料快照的最簡單的類是:
public static class User {
public String Name;
public long Age;
}
這個類對資料庫中的每個屬性都有一個公共欄位,編譯器將生成一個默認的、無引數的建構式,這是 FirebaseUser為資料創建物件所需要的。
更常見的模式是為屬性創建 getter 和/或 setter。使用您的兩個屬性的所有這些,您將獲得:
public static class User {
String Name;
long Age;
public String getName() { return Name }
public void getName(String name) { Name = name }
public long getAge() { return Age }
public void setSage(long age) { Age = age }
}
現在有了這些欄位本身不再需要公開,如果需要,我們可以在 get 和 set 方法中做額外的作業。但是現在將使用 JavaBean 命名轉換從這些 getter 和 setter 中確定屬性的名稱,這會導致屬性name和age使用與資料庫中不同的大小寫。
為了解決這個問題,您可以在代碼中提供每個欄位的資料庫屬性的注釋:
public static class User {
String Name;
long Age;
@PropertyName("Name")
public String getName() { return Name }
@PropertyName("Name")
public void getName(String name) { Name = name }
@PropertyName("Age")
public long getAge() { return Age }
@PropertyName("Age")
public void setSage(long age) { Age = age }
}
現在 Firebase 映射器將讀取PropertyName注釋,并能夠再次正確映射資料庫中的資料和物件中的資料。
如果您的類具有比資料庫中的資料更多的屬性(因此是公共欄位或 getter/setter),則當它從資料庫中讀取資料時,這些屬性不會被填充。寫入資料庫時??,附加屬性將寫入資料庫。
如果你想防止這種情況,你可以使用@IgnoreExtraProperties注解。
另見:
- Firestore 排除資料序列化
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/465507.html
標籤:爪哇 安卓 火力基地 firebase-实时数据库
