使用getValue调用Firebase时,没有在类org.json.JSONObject上找到的要序列化的属性

时间:2017-07-28 19:02:08

标签: java android json firebase firebase-realtime-database

我有一个带有GridView的简单主活动,每个项目都有一个TextView,我想用Firebase数据库中存储的每个项目的内容之一填充。当我调用getValue()时出现问题。应用程序崩溃,我收到以下错误:

com.google.firebase.database.DatabaseException: No properties to serialize found on class org.json.JSONObject

我正在使用我制作的自定义适配器来解析数据到GridView。我的代码如下:

public class MainActivity extends AppCompatActivity {

     public JSONArray tables = new JSONArray();

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

         GridView grid = (GridView) findViewById(R.id.table_grid);

         FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
         DatabaseReference databaseReference = firebaseDatabase.getReference("development/store_1/tables");
         databaseReference.child("items").addValueEventListener(new ValueEventListener() {
             @Override
             public void onDataChange(DataSnapshot dataSnapshot) {
                 Iterable<DataSnapshot> children = dataSnapshot.getChildren();

                 for (DataSnapshot child : children) {
                     JSONObject table = child.getValue(JSONObject.class);
                tables.put(table);
            }
        }

             @Override
             public void onCancelled(DatabaseError databaseError) {
                  String error = databaseError.getMessage().toString();
                  Toast.makeText(MainActivity.this, error, Toast.LENGTH_SHORT).show();
             }
         });

         TableAdapter tableAdapter = new TableAdapter(this, tables, 0);
         grid.setAdapter(tableAdapter);
     }
 }

1 个答案:

答案 0 :(得分:0)

解决这个问题已经有很长时间了,但是我想答案也可以帮助其他人。我使用tableGridAdapter和相邻的onItemClickListener代替了valueEventListener。解决我的问题的代码如下(我省略了该问题未涉及的部分代码):

public class MainMenuActivity extends Activity {

    int pending = 0;
    JSONArray tables = new JSONArray();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        pending = getIntent().getIntExtra("Pending Table", 0);
        
        setContentView(R.layout.activity_main_menu_tables);
        GridView tablesGrid = (GridView) findViewById(R.id.main_menu_tables_grid);

        SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);

        FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
        DatabaseReference databaseReference = firebaseDatabase.getReference(prefs.getString("mode", "pythonanywhere")
            + "/store_" + prefs.getInt("store_id", 0) + "/tables");
        final TableGridAdapter tableGridAdapter = new TableGridAdapter(this, databaseReference, pending);
        tablesGrid.setAdapter(tableGridAdapter);

        tablesGrid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                view.setSelected(true);
                tables = tableGridAdapter.getTables();

                try {
                    table = tables.getJSONObject(i).getInt("id");
                    tableName = tables.getJSONObject(i).getString("name");
                    availability = tables.getJSONObject(i).getInt("active");
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                flag = false;
                createMainMenu();
            }
        });
    }

}