【发布时间】:2019-03-09 04:15:11
【问题描述】:
我已转换为 Firebase 进行 Android 开发,因为我想利用 Firebase 的许多功能(通知、消息传递、存储等),但是,我无法从 Firebase 接收数据并且无法在线找到详细信息。是的,我已经尝试过文档,但它没有解释我正在经历的事件。
我想检索我拥有的所有数据,并将其插入到对象数组列表中。这是一个静态示例:
users[i] = new User("James" + (i*2.5), "Hmack00" + (i*2), "https://firebasPic_2019.03.03.05.26.35.jpg.jpg?alt=media&token=cf", "United Kingdom");
数据库:
{
"Users" : {
"4PdlTlv3qjZ3BmDvrJyUut9Fnq43" : {
"Country" : "xx",
"Fullname" : "hh",
"ProfilePicture" : "htm/o/Images%2FSearchAdapter%2F4PdlTlv3qjZ3BmDvrJyUut9Fnq43%2FProfilePicture%2FProfilePic_2019.03.06.10.47.54.jpg.jpg?alt=media&token=b647708e-c6d5-4b45-bef0-3dc40301b73a",
"Username" : "hmack001"
},
"COg4r4io9hezhFpmK3adPucUXA93" : {
"Country" : "spain",
"Fullname" : "nat",
"ProfilePicture" : "hcom/o/Images%2FSearchAdapter%2FCOg4r4io9hezhFpmK3adPucUXA93%2FProfilePicture%2FProfilePic_2019.03.06.19.14.17.jpg.jpg?alt=media&token=8620b321-5cef-42f0-a828-dbb7c37c8e7d",
"Username" : "nat"
},
"Tw1xRxViygNsLqrQiaaMAvAduIu1" : {
"Country" : "uk",
"Fullname" : "harvey\n",
"ProfilePicture" : "t.com/o/Images%2FUsers%2FTw1xRxViygNsLqrQiaaMAvAduIu1%2FProfilePicture%2FProfilePic_2019.03.03.05.26.35.jpg.jpg?alt=media&token=c290e75a-5f92-4271-bcb5-c644fe1b14ef",
"Username" : "RGB"
},
"vOxr1RoDqgWogKK1lp9pfpTHc6w2" : {
"Country" : "scotland ",
"Fullname" : "greg greg",
"ProfilePicture" : "ot.com/o/Images%2FSearchAdapter%2FvOxr1RoDqgWogKK1lp9pfpTHc6w2%2FProfilePicture%2FProfilePic_2019.03.04.12.30.22.jpg.jpg?alt=media&token=27b024cf-0691-4121-8a27-26acf101ebc2",
"Username" : "greg"
},
"xecUOPeyMcQaQrgkU9ouDgK90Ai1" : {
"Country" : "ggh",
"Fullname" : "Da apply ",
"ProfilePicture" : "2FProfilePic_2019.03.03.04.58.50.jpg.jpg?alt=media&token=f35854c2-3ff9-4d18-9f7a-10c13f066c68",
"Username" : "gg"
}
}
}
这是我的代码,之后我会解释我的错误(我留在了“僵尸”代码中,以显示我所做的尝试)
//Firebase Variables
private FirebaseDatabase mFirebaseDatabase;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference myRef;
//Firebase Data
mAuth = FirebaseAuth.getInstance();
mFirebaseDatabase = FirebaseDatabase.getInstance();
userId = mAuth.getCurrentUser().getUid();
myRef = mFirebaseDatabase.getReference().child("Users").child(userId);
//Firebase Data
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) { //Function called every time a change is made to the database
showData(dataSnapshot);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) { //Function called when there is an error in the database/ with the call
Log.d("Print","Cancelled Firebase: " + databaseError.toString());
}
});
}
private void showData(DataSnapshot dataSnapshot) {
int userCount = 5;
int i = 0;
for (DataSnapshot ds : dataSnapshot.getChildren()) {
//User user = new User();
//User user = new User(); //Get Count of Firebase Users
//user = new User();
if (ds.child(userId).exists()) {
/*user.setFullname(ds.child(userId).getValue(User.class).getFullname()); //set the full name
user.setUsername(ds.child(userId).getValue(User.class).getUsername()); //set the username
user.setProfilePicture(ds.child(userId).getValue(User.class).getProfilePicture()); //set the profile picture
//Display Information
Log.d("DataSnapchat Test", "ShowData Name: " + user.getFullname());
Log.d("DataSnapchat Test", "ShowData Username: " + user.getUsername());
Log.d("DataSnapchat Test", "ShowData Picture: " + user.getProfilePicture());
ArrayList<String> userArrayList = new ArrayList<>();
userArrayList.add(user.getFullname());
userArrayList.add(user.getUsername());
userArrayList.add(user.getProfilePicture());
*/
String fullname = (String) ds.child(userId).child("Fullname").getValue();
Toast.makeText(this, "Fullname: " + fullname, Toast.LENGTH_SHORT).show();
//UserListAdapter adapter = new UserListAdapter(this, R.layout.find_profiles_search, userArrayList, mProfileSearch);
//mListView.setAdapter(adapter);
i++;
}
}
}
当我调试代码时,从不调用 showData 函数,也没有调用值事件侦听器中的函数,这是异步问题吗?
目前我正在尝试获取数据并将其插入到变量中(实际上是任何数据,一旦我有一个工作查询,我可以通过操作子字段等将其转换为适合)。
问题:addValueListener 是否仅在数据库中的数据发生更改时才起作用?如果是,那么有什么替代方案,如果不是,那么为什么这些功能无法运行。
我没有收到任何错误,控制台也没有记录任何内容。
我想将我的数据库放入一个数组列表中,我知道我不应该使用 getChildren 来执行此操作,因此我正在尝试在尝试获取所有数据之前测试是否可以获取任何数据。
【问题讨论】:
-
你是说你的
onDataChange和你的onCancelled都没有被调用吗?如:如果您只是将Log.d语句放入`onDataChange,那么您的日志语句都不会被写入?这通常只有在设备没有连接到 Firebase 服务器时才会发生。 -
是的,这就是正在发生的事情。但是,我从“getCurrentUser()”中获得了正确的 userId,当我调试代码时,mAuth 变量保存了实时数据库的正确值。我不确定这是否是 Aysnc 问题,如果是,我不知道如何应对。
-
myRef 变量包含 - https://{project name}.firebaseio.com/Users/{userId}。然而,事件监听器从未被调用。
-
对不起,仍然很难解析您的代码,所以我正在尝试简化它。这个想法是你运行简化的代码,然后告诉我们结果。如果您用简单的日志语句替换对
showData的调用,日志语句会显示在您的日志输出中吗?
标签: android firebase firebase-realtime-database