Pro*_*ixs 13 java android firebase google-cloud-firestore
带有(DocumentSnapShot documentsnapShot)参数的自定义对象.也是来自Firebase的内部对象,它检索快照并将值设置为我的自定义模型也有其参数(DocumentSnapShot documentsnapShot).但是,我希望从Firebase获取数据并将其传递给我的自定义参数,因为我不仅会获取Firebase的多个数据.如果没有覆盖,就不可能迭代Firestore.
这是代码:
public UserSettings getUserSettings(DocumentSnapshot documentSnapshot){
Log.d(TAG, "getUserSettings: retrieving user account settings from firestore");
DocumentReference mSettings = mFirebaseFirestore.collection("user_account_settings").document(userID);
mSettings.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
settings.setDisplay_name(documentSnapshot.getString("display_name"));
settings.setUsername(documentSnapshot.getString("username"));
settings.setWebsite(documentSnapshot.getString("website"));
settings.setProfile_photo(documentSnapshot.getString("profile_photo"));
settings.setPosts(documentSnapshot.getLong("posts"));
settings.setFollowers(documentSnapshot.getLong("followers"));
settings.setFollowing(documentSnapshot.getLong("following"));
}
});
}
Run Code Online (Sandbox Code Playgroud)
Ale*_*amo 14
您现在无法返回尚未加载的内容.Firestore加载数据asynchronously,因为它可能需要一些时间.根据您的连接速度和状态,可能需要几百毫秒到几秒才能获得数据.如果要将settings对象传递给另一个方法,只需在方法内调用该方法onSuccess()并将该对象作为参数传递.所以快速解决这个问题:
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
yourMethod(settings);
}
Run Code Online (Sandbox Code Playgroud)
还有一点需要提及的是,您不需要将这些值设置为已经拥有它们的对象.您已经将数据库中的数据作为对象获取.
所以请记住,onSuccess()method有一个异步行为,这意味着甚至在从数据库获取数据之前就会调用它.如果要使用该settings方法之外的对象,则需要创建自己的对象callback.要实现这一点,首先需要创建一个这样的接口:
public interface MyCallback {
void onCallback(UserAccountSettings settings);
}
Run Code Online (Sandbox Code Playgroud)
然后,您需要创建一个实际从数据库获取数据的方法.此方法应如下所示:
public void readData(MyCallback myCallback) {
DocumentReference mSettings = mFirebaseFirestore.collection("user_account_settings").document(userID);
mSettings.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
myCallback.onCallback(settings);
}
});
}
Run Code Online (Sandbox Code Playgroud)
最后,只需调用readData()方法并将MyCallback接口的实例作为参数传递给您需要的地方,如下所示:
readData(new MyCallback() {
@Override
public void onCallback(UserAccountSettings settings) {
Log.d("TAG", settings.getDisplay_name());
}
});
Run Code Online (Sandbox Code Playgroud)
这是您可以使用UserAccountSettingsclass outside onSuccess()方法的唯一方法.有关更多信息,您还可以查看此视频.
用作LiveData返回类型并观察其值的变化以执行所需的操作。
private MutableLiveData<UserAccountSettings> userSettingsMutableLiveData = new MutableLiveData<>();
public MutableLiveData<UserAccountSettings> getUserSettings(DocumentSnapshot documentSnapshot){
DocumentReference mSettings = mFirebaseFirestore.collection("user_account_settings").document(userID);
mSettings.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
settings.setDisplay_name(documentSnapshot.getString("display_name"));
settings.setUsername(documentSnapshot.getString("username"));
settings.setWebsite(documentSnapshot.getString("website"));
settings.setProfile_photo(documentSnapshot.getString("profile_photo"));
settings.setPosts(documentSnapshot.getLong("posts"));
settings.setFollowers(documentSnapshot.getLong("followers"));
settings.setFollowing(documentSnapshot.getLong("following"));
userSettingsMutableLiveData.setValue(settings);
}
});
return userSettingsMutableLiveData;
}
Run Code Online (Sandbox Code Playgroud)
然后从您的Activity/Fragment观察LiveData中onChanged进行您想要的操作。
getUserSettings().observe(this, new Observer<UserAccountSettings>() {
@Override
public void onChanged(UserAccountSettings userAccountSettings) {
//here, do whatever you want on `userAccountSettings`
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3352 次 |
| 最近记录: |