Android 数据未从Firebase插入ArrayList
我正在尝试将Firebase节点的数据添加到ArrayList对象中。但是数据没有填充到我的ArrayList对象中,当调用onPostExecute()时,我得到的ArrayList大小为0 如何将Firebase节点添加到ArrayList中 我的android代码Android 数据未从Firebase插入ArrayList,android,firebase,firebase-realtime-database,arraylist,synchronization,Android,Firebase,Firebase Realtime Database,Arraylist,Synchronization,我正在尝试将Firebase节点的数据添加到ArrayList对象中。但是数据没有填充到我的ArrayList对象中,当调用onPostExecute()时,我得到的ArrayList大小为0 如何将Firebase节点添加到ArrayList中 我的android代码 public class FirebaseSyncContacts extends AsyncTask<Void,Void,Void> { Map<String,String > contact
public class FirebaseSyncContacts extends AsyncTask<Void,Void,Void> {
Map<String,String > contacts;
ArrayList<FirebaseUserModel> userModelObjects;
Context context;
public FirebaseSyncContacts(Context context,Map<String,String>contacts)
{
this.context=context;
this.contacts=contacts;
userModelObjects=new ArrayList<>();
}
protected void onPreExecute() {
Log.i("app","Syncing started");
}
protected Void doInBackground(Void... voids) {
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("Users");
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
for(Map.Entry<String, String> singleContact: contacts.entrySet()) {
if (dataSnapshot.hasChild(singleContact.getKey())) {
Log.i("app", "Present: " + singleContact.getKey());
userModelObjects.add(dataSnapshot.getValue(FirebaseUserModel.class));
}
else {
Log.i("app", "Absent: " + singleContact.getKey());
userModelObjects.add(dataSnapshot.getValue(FirebaseUserModel.class));
}
}
}
public void onCancelled(DatabaseError databaseError) {
Log.i("app","failed to connect: "+databaseError.getMessage());
}
});
return null;
}
protected void onPostExecute(Void aVoid) {
Log.i("app","total contacts added: "+userModelObjects.size()); // always getting 0
}
}
火基结构
-Users
-ContactNo
-fname
-lname
-gender
-isInstalled
-day
-month
-year
预期结果:
它应该将每个联系人号码节点添加到userModelObjects ArrayList中,并返回onPostExecute()ArrayList的总大小,即添加的联系人总数
实际结果:
onPostExecute()之后返回的大小为0,即未添加任何对象
编辑
我收到了每个联系人的警告
W/ClassMapper:在com.demo.example.Firebase.FirebaseUserModel类上找不到91987654321的setter/字段
我已删除ASyncTask,但仍遇到此问题。将类名从:
public class FirebaseUserModel {....
到
for循环变为:
for( DataSnapshot snapShot: dataSnapshot.getChildren()) {
ContactNo userModel = snapShot.getValue(ContactNo.class);
userModelObjects.add(userModel);
}
更新
-Users
-ContactNo
-fname
-lname
-gender
-isInstalled
-day
-month
-year
首先,正如我所说的,您不需要asyncTask,因此只要在您希望的任何地方使用以下代码,因为firebase为您处理后台线程:
//In your activity, do this directly:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("Users");
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot snapShot: dataSnapshot.getChildren()) {
ContactNo userModel = snapShot.getValue(ContactNo.class);
userModelObjects.add(userModel);
}
}
public void onCancelled(DatabaseError databaseError) {
Log.i("app","failed to connect: "+databaseError.getMessage());
}
});
这一定是你的新课
public class ContactNo {
//make sure that these names are exactly like the keys in your database
private String fname,lname,gender;
//note if isInstalled is supposed to be a boolean, then make it a boolean and not an int
private int isInstalled,day,month,year;
public ContactNo() { }
public ContactNo(String fname,String lname,String gender,int isInstalled,int day,int month,int year)
{
this.fname=fname;
this.lname=lname;
this.gender=gender;
this.isInstalled=isInstalled;
this.day=day;
this.month=month;
this.year=year;
}
}我认为您不需要asyncTask。这个问题是由asyncTask引起的吗?如何知道任务在没有AsyncTask的情况下完成?您不需要AsyncTask,因为firebase快照侦听器已经是一段异步代码。它正在后台监听,当您查询中的文档更新时将触发。这里要做的是在异步任务中设置一个异步任务。好的。现在我已经删除了ASyncTask,但仍然遇到同样的问题。如何解决此问题。实际上ContactNo是用户联系人号码,每次添加新联系人时,它都会发生变化。对于每个联系人号码,我都会收到此警告:W/ClassMapper:No setter/field for 91987654321在com.demo.example.Firebase.firebaseUserModel类中找到。您可以在doInBackground()中修改我的代码吗每个循环的方法?因为我在将我的每个地图键与firebase进行比较时被卡住了
public class ContactNo {
//make sure that these names are exactly like the keys in your database
private String fname,lname,gender;
//note if isInstalled is supposed to be a boolean, then make it a boolean and not an int
private int isInstalled,day,month,year;
public ContactNo() { }
public ContactNo(String fname,String lname,String gender,int isInstalled,int day,int month,int year)
{
this.fname=fname;
this.lname=lname;
this.gender=gender;
this.isInstalled=isInstalled;
this.day=day;
this.month=month;
this.year=year;
}