我正在尝试从Firebase数据库中将检索到的值添加到Arraylist,再从那里添加到String数组。我的检索方法工作正常。我可以将所有值打印在烤面包上。但是显然它不会被添加到arraylist中。
这是我的代码,用于在片段类的onActivityCreated()中进行检索。
ArrayList<String> allBrands = new ArrayList<>();
brandRef=FirebaseDatabase.getInstance().getReferenceFromUrl("https://stockmanager-142503.firebaseio.com/Brands");
q=brandRef.orderByChild("brandName");
q.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
allBrands.add((dataSnapshot.getValue(Brand.class)).getBrandName());
Toast.makeText(getActivity(),(dataSnapshot.getValue(Brand.class)).getBrandName(), Toast.LENGTH_SHORT).show();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
这就是我试图在Fragment类的OnActivityResult()方法中使用arrayList的地方,但是我认为不会执行迭代器循环。没有看到烤面包。当我尝试使用数组时,出现了空指针异常。我假设这些值不会复制到brands数组中。
count=allBrands.size();
String[] brands=new String[count];
Iterator<String> itemIterator = allBrands.iterator();
if(itemIterator.hasNext()){
//brands[i] = itemIterator.next();
Toast.makeText(getActivity(), itemIterator.next(), Toast.LENGTH_SHORT).show();
// i++;
}
for( i=0;i<count;i++){
if(brands[i].compareTo(Brand)==0){
f=1;break;
}
}
这是我的数据库,以防万一。但是我可以毫无问题地将所有检索到的值打印在Toast中。
从共享的代码中很难确定,因为我怀疑您可能会从Firebase异步加载所有数据的事实中感到困惑。另外,您可能根本无权读取数据。我会给两个答案。
数据异步加载
将一些日志语句添加到最小代码段中时,最容易理解此行为:
System.out.println("Before attaching listener");
q.addChildEventListener(new ChildEventListener() {
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
System.out.println("In onChildAdded");
}
public void onChildChanged(DataSnapshot dataSnapshot, String s) { }
public void onChildRemoved(DataSnapshot dataSnapshot) { }
public void onChildMoved(DataSnapshot dataSnapshot, String s) { }
public void onCancelled(DatabaseError databaseError) { }
});
System.out.println("After attaching listener");
该代码段的输出将是:
附加监听器之前
附加监听器后
在onChildAdded中(可能多次)
这可能不是您期望输出的顺序。这是因为Firebase(与大多数云API一样)异步地从数据库加载数据:它不等待数据返回,而是继续在主线程中运行代码,并且然后ChildEventListener.onChildAdded
在数据可用时回叫您。
无法在Android上等待数据。如果这样做,您的用户将得到令人生畏的“应用程序无响应”对话框,并且您的应用程序将
被杀死。
因此,处理此API异步特性的唯一方法是将需要具有新数据的代码放入onChildAdded()
回调中(并
可能在某些时候也放入其他回调中):
q.addChildEventListener(new ChildEventListener() {
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
allBrands.add((dataSnapshot.getValue(Brand.class)).getBrandName());
System.out.println(allBrands.length);
}
您需要获得读取数据的权限
您需要权限才能从某个位置读取数据。如果您没有权限,Firebase将立即取消监听器。您需要
在代码中处理这种情况,否则您将一无所知。
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
问题内容: 检索数据有效,但是我无法将检索到的数据保存到ArrayList中。在“ onDataChanged()”方法之后,ArrayList“配置文件”似乎具有2个值,但在return语句中它具有0个值。 问题答案: 您现在无法返回尚未加载的内容。换句话说,您不能简单地在方法之外返回列表,因为它总是由于该方法的异步行为而引起的。这意味着,当您尝试返回该方法之外的结果时,数据尚未完成从数据库的加
首先,我对firebase数据库很陌生。我正在研究如何从firebase检索当前的UID(即当前登录的UID),并将其与一个值一起插入到firebase的child中。 我正在尝试将我当前的UID和它的值推送到Firebase。我很难把它推到火力点。下面是我的firebase结构: 试用后,我仍然无法获得以下代码来检索UID。我对以及这一行遇到了麻烦。 下面是我的构造函数:
函数setUpMapIfNeeded()中的getFragmentManager返回。我把我的片段与activity_main.xml分开,这里是我的代码: activity_main.xml: fragment_main.xml: 这是我的*.Java文件: 我已尝试将getSupportFramentManager与Android.support.v4.app.DialogFragment支持
web.xml 应用程序-servlet.xml context.xml(在tomcat conf文件夹中) 谢谢你的建议和帮助。
我对Firebase真的是个新手。我正在做一个使用firestore作为数据库的Android应用程序。我的问题是当我试图检查某个数据是否存在时。它总是说它没有。 这就是发生这种情况的方法。 如您所见,我在这里检查了可以从firestore检索的数据: 这就是我对Utilizadores的定义。
问题内容: 我正在法国学习,所以很难找到法语教程来解决我的问题。因此,我不得不问我的问题,希望有一个令人满意的解决方案。 我的问题是我在firebase上读取数据时遇到了麻烦,并且花了三天时间。 我有这样的结构: 我已经开始编写一些代码,可以恢复密钥,但是无法恢复这些值“ nom”,“ argent”等。 问题答案: John的替代方法是使用来获取每个属性: