[英]How to use Firebase Realtime Database persistence to store some childs of a node
我的代码工作正常,没有任何崩溃,但我遇到的唯一问题是无法同步 Firebase 实时数据库离线我在某些节点上尝试过 keepsync(true) 但不起作用。我正在尝试从聊天列表中获取节点用户的引用. 我想要做的是,如果用户登录,他将看到下面提到的用户是他的 recyclerview 中 Chatlist 节点中的 Uid。我能够成功地做到这一点,但当互联网连接断开时,我无法离线存储这些用户。 它再次加载所有用户。
我的代码
public class Chats extends Fragment {
private RecyclerView recyclerView;
private UserAdapter mUserAdapter;
FloatingActionButton profile, credentials;
DatabaseReference rootRef;
DatabaseReference ChatlistRef;
DatabaseReference UserRef0;
DatabaseReference UserRef1;
DatabaseReference UserRef2;
ValueEventListener mValueEventListener;
ValueEventListener eventListener0;
ValueEventListener eventListener1;
ValueEventListener eventListener2;
List<String> UserChatList= new ArrayList<>();
private List<User> mUsers;
String TAG ="Tag2";
private static final String MESSAGE_KEY = "Message_Key";
private Handler mHandler;
int UserListSize;
public Chats() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_chats, container, false);
//DatabaseReference ChatListReference = FirebaseDatabase.getInstance().getReference
//("Chatlist").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
//ChatListReference.keepSynced(true);
profile = view.findViewById(R.id.fab_edit_profile_pic);
credentials = view.findViewById(R.id.fab_edit_name);
FabAction();
recyclerView = view.findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mUsers = new ArrayList<>();
// mUserAdapter.notifyDataSetChanged();
//callChatlist();
chatlist_loop();
return view;
}
private void chatlist_loop(){
mUsers.clear();
mUserAdapter = new UserAdapter(getContext(), mUsers, false);
recyclerView.setAdapter(mUserAdapter);
mUserAdapter.notifyDataSetChanged();
String fuser;
fuser = FirebaseAuth.getInstance().getCurrentUser().getUid();
rootRef = FirebaseDatabase.getInstance().getReference();
ChatlistRef = rootRef.child("Chatlist").child(fuser);
ChatlistRef.keepSynced(true);
mValueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String userID = ds.getKey();
DatabaseReference UserRef= FirebaseDatabase.getInstance().getReference("Users").child(userID);
UserRef.keepSynced(true);
Log.d(TAG," UserRef : "+UserRef);
ValueEventListener eventListener=new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
if(!mUsers.contains(user)){
mUsers.add(user);
mUserAdapter.notifyDataSetChanged();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
UserRef.addListenerForSingleValueEvent(eventListener);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "loadPost:onCancelled", databaseError.toException());
}
};
ChatlistRef.addValueEventListener(mValueEventListener);
}
}
您似乎没有在任何地方设置持久性。 keepSynced 只设置一个监听器。 您需要执行以下操作:
FirebaseDatabase database;
database = FirebaseDatabase.instance;
bool success = database.setPersistenceEnabled(true);
如果设置了持久性,则对 setPersistenceEnabled 的调用返回一个布尔值 true。
您需要在调用第一个引用之前设置持久性。
更新:
要离线使用 Firebase,请在启动应用程序时使用 setPersistenceEnabled(true) 打开持久性。 完成任何数据库调用后,您无法再次将其关闭,即。 使用 setPersistenceEnabled(false) 没有效果。
您现有的侦听器将确保他们引用的数据保持同步。 如果您的数据库节点没有定义侦听器并且您希望保持同步,即。 保持数据新鲜,然后使用 keepSynced 为它们创建一个监听器。 您可以使用 keepSynced(true) 和 keepSynced(false) 打开或关闭该侦听器。 如果您不主动保持特定节点数据的最新状态,则应用程序可能会使用设备上持久数据中的旧值,因为它通常会首先读取该值。 但是,在使用 keepSynced 时要小心,否则您可能会发现自己下载了太多数据。
有关所有信息,请参阅: https://firebase.google.com/docs/database/android/offline-capabilities 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.