【问题标题】:Retrieving data from Firebase in Android在 Android 中从 Firebase 检索数据
【发布时间】:2017-02-09 10:01:26
【问题描述】:

我的数据库如下所示:

我的活动代码是这样的:

    public class FirebaseActivity extends AppCompatActivity {

    ListView lv;

    private FirebaseDatabase database;
    private DatabaseReference myRef;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_firebase);

        final List<String> glocations = new ArrayList<String>();

        lv = (ListView) findViewById(R.id.lv);

        database = FirebaseDatabase.getInstance();
        myRef = database.getReference();
        myRef.child("Users").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
               Iterable<DataSnapshot> children = dataSnapshot.getChildren();

                for (DataSnapshot child: children){
                    String data = child.getValue(String.class);
                    glocations.add(data);

                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,glocations);

        lv.setAdapter(adapter);
    }
}

现在,每当我尝试从主要活动的设置菜单中打开活动时,我的应用程序都会崩溃。我想要做的就是显示纬度、经度和时间戳,每次用户通过使用带有数组适配器的简单列表在列表视图中更改它们时。 这是一项不同的活动,而不是主要活动。主要的工作完美。我看了无数个视频,我无法理解我的错误。

我从 logcat 得到的错误是这样的

致命异常:主要 进程:com.thanoszoug.geofenceexample,PID:9954 com.google.firebase.database.DatabaseException:转换失败 java.util.HashMap 类型的值到 String 在 com.google.android.gms.internal.zzbqi.zzaD(未知来源) 在 com.google.android.gms.internal.zzbqi.zzb(未知来源) 在 com.google.android.gms.internal.zzbqi.zza(未知来源) 在 com.google.firebase.database.DataSnapshot.getValue(未知来源) 在 com.thanoszoug.geofenceexample.FirebaseActivity$1.onDataChange(FirebaseActivity.java:42) 在 com.google.android.gms.internal.zzbmz.zza(未知来源) 在 com.google.android.gms.internal.zzbnz.zzYj(未知来源) 在 com.google.android.gms.internal.zzboc$1.run(未知来源) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:158) 在 android.app.ActivityThread.main(ActivityThread.java:7229) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

【问题讨论】:

  • 如果您的应用程序崩溃,logcat 将包含异常的堆栈跟踪。请将其添加到您的问题中,以提高您获得帮助的机会。
  • 完成,感谢您注意到这一点。

标签: android listview firebase firebase-realtime-database android-arrayadapter


【解决方案1】:

我相信在这一行会抛出异常:

String data = child.getValue(String.class);

getValue 将以HashMap 的形式为您获取节点“匿名”以及其下的所有其余数据。由于您尝试将其解析为String,因此会引发此错误:

将 java.util.HashMap 类型的值转换为字符串失败

获取“匿名”节点级别的原因是您最初将您的侦听器指向“用户”,并且您使用foreach循环遍历其子节点,每个子节点的值都在“匿名”级别.

我建议您重新考虑使用String,此外,如果您希望检索您的位置数据,您应该以您自己的自定义方式通过.child("Anonymous").child("Location").child("-KcU....") 访问它。

【讨论】:

  • 我解决了这个问题。我现在的问题是,我在主要活动中使用带有 .push() 的唯一键,但我想在另一个活动中显示我的数据库列表。是一种通过使用 .child("Anonymous").child("Location").child("-KcU....") 来获取这些密钥的方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多