No properties to serialize found on class org.json.JSONObject when calling Firebase with getValue

Viewed 685

I have a simple Main Activity with a GridView and every item has a TextView which I want to fill with one of the contents of every item stored in Firebase database. The problem emerges when I invoke getValue(). The app crashes and I get the following error:

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

I am using a custom Adapter I made to parse the data to the GridView. My code is as follows:

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 Answers

It has been a long time since I solved this but I guess the answer can help others as well. Instead of a valueEventListener I used tableGridAdapter and the adjacent onItemClickListener. The code which solved my problem is the following (I am omiting parts of the code not involved in the problem):

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();
            }
        });
    }

}
Related