从Firebase检索数据时出现问题:com.google.firebase.database.DatabaseException:无法将java.util.ArrayList类型的值转换为String

时间:2019-04-12 16:08:37

标签: android firebase firebase-realtime-database

我是Firebase的新手,正试图从android中的Firebase实时数据库访问数据。

这是数据: MY FIREBASE DATA

下面是代码

包com.manju.wista.fb_database;

import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.Toast;
import com.google.firebase.FirebaseApp;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.GenericTypeIndicator;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    DatabaseReference dbr;
    JSONObject jsonObject;
    JSONArray jArray;

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

        dbr = FirebaseDatabase.getInstance().getReference("BUSES_DATA/0");

        dbr.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                GenericTypeIndicator<Map<String, String>> genericTypeIndicator = new GenericTypeIndicator<Map<String, String>>() {};
                Map<String, String> map = dataSnapshot.getValue(genericTypeIndicator );

                Toast.makeText(getApplicationContext(),map.get("origin") , Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });


    }

    @Override
    protected void onStart() {
        super.onStart();

    }
}

当我运行代码时

dbr = FirebaseDatabase.getInstance().getReference("BUSES_DATA/0"); 
or
dbr = FirebaseDatabase.getInstance().getReference("BUSES_DATA/1");

我遇到错误

如果我使用

dbr = FirebaseDatabase.getInstance().getReference("BUSES_DATA/2");

它敬酒了

..任何人都可以帮忙

1 个答案:

答案 0 :(得分:1)

您正在尝试从快照中提取Map<String, String>

如果您收听BUSES_DATA/2,这是可行的,因为BUSES_DATA/2下的每个属性都有一个简单的字符串值。

如果您收听BUSES_DATA/0BUSES_DATA/1,则失败,因为某些子节点没有简单的字符串。具体来说,BUSES_DATA/*/json_content是一个嵌套的JSON对象。由于嵌套的JSON对象不是字符串,因此当您要求数据库对其进行转换时,数据库会引发错误。

一次解决方案是从这些快照中提取Map<String, Object>。您会发现,在映射的前两个子节点中,然后包含一个键json_content,该键包含另一个Map<String, Object>作为其值。