Store and fetch a 2-D List of different sub-classes to Google Firebase












0















I have been building a multiplayer checker game for my class project.
The below code is in Room class because every game should have a checkerboard.



I converted to 2D List because Firebase does not serialize arrays.



Each of object stored in the list is a subclass of Checker, including nullc (a substitute for null). The reason why I store nullc in the list is that the list has two rows consist of only nulls, and Firebase does not store the index of those two rows.



this.checkerList = new ArrayList<List<Checker>>();
Checker nullc = new NullChecker();
Checker checkerArray = new Checker
{{nullc, new RedChecker(0,1), nullc, new RedChecker(0,3),
nullc, new RedChecker(0,5), nullc, new RedChecker(0,7)},
{new RedChecker(1,0), nullc, new RedChecker(1,2),nullc, new RedChecker(1,4), nullc, new RedChecker(1,6), nullc},
{nullc, new RedChecker(2,1), nullc, new RedChecker(2,3), nullc, new RedChecker(2,5), nullc, new RedChecker(2,7)},
{nullc, nullc, nullc, nullc,nullc, nullc,nullc, nullc},
{nullc, nullc, nullc, nullc,nullc, nullc,nullc, nullc},
{new BlackChecker(5,0), nullc, new BlackChecker(5,2),nullc, new BlackChecker(5,4), nullc, new BlackChecker(5,6), nullc},
{nullc, new BlackChecker(6,1), nullc, new BlackChecker(6,3), nullc, new BlackChecker(6,5), nullc, new BlackChecker(6,7)},
{new BlackChecker(7,0), nullc, new BlackChecker(7,2),nullc, new BlackChecker(7,4), nullc, new BlackChecker(7,6), nullc}};

for(int r = 0; r < checkerArray.length; r++){
List <Checker> row = new ArrayList <Checker>();
for(int c = 0; c < checkerArray[r].length; c++){
row.add(checkerArray[r][c]);
}
this.checkerList.add(row);
}


The problem I have now is the list stores fine in Firebase database. However, when I retrieve the whole list from the database, the subclasses are not subclasses anymore.



    refThisRoom.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.getValue(Room.class).getPlayer2() != null){
turn = dataSnapshot.getValue(Room.class).getTurn();
checkerList = dataSnapshot.getValue(Room.class).getCheckerList();

for(int r = 0; r < checkerList.size(); r++){
Log.d("checkerList", "row" + String.valueOf(r));
Log.d("checkerList", "rowSize" + String.valueOf(checkerList.size()));
for(int c = 0; c < checkerList.get(r).size(); c++){
Log.d("checkerList", "Column" + String.valueOf(c));
Log.d("checkerList", "ColumnSize" + String.valueOf(checkerList.get(r).size()));
Log.d("checkerList","hello: "+checkerList.get(r).get(c).getClass().getSimpleName());
}

}
Toast.makeText(BlackCheckerActivity.this,"Player Entered",Toast.LENGTH_LONG).show();
updateAllButtons();
disableButtons();
}
else{
Toast.makeText(BlackCheckerActivity.this,"Waiting for another player",Toast.LENGTH_LONG).show();
}
}

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

}
});


Instead of returning BlackChecker, RedChecker, and NullChecker, it is just returning checker. I am stuck now because I am using instanceof to determine each checker's move.










share|improve this question





























    0















    I have been building a multiplayer checker game for my class project.
    The below code is in Room class because every game should have a checkerboard.



    I converted to 2D List because Firebase does not serialize arrays.



    Each of object stored in the list is a subclass of Checker, including nullc (a substitute for null). The reason why I store nullc in the list is that the list has two rows consist of only nulls, and Firebase does not store the index of those two rows.



    this.checkerList = new ArrayList<List<Checker>>();
    Checker nullc = new NullChecker();
    Checker checkerArray = new Checker
    {{nullc, new RedChecker(0,1), nullc, new RedChecker(0,3),
    nullc, new RedChecker(0,5), nullc, new RedChecker(0,7)},
    {new RedChecker(1,0), nullc, new RedChecker(1,2),nullc, new RedChecker(1,4), nullc, new RedChecker(1,6), nullc},
    {nullc, new RedChecker(2,1), nullc, new RedChecker(2,3), nullc, new RedChecker(2,5), nullc, new RedChecker(2,7)},
    {nullc, nullc, nullc, nullc,nullc, nullc,nullc, nullc},
    {nullc, nullc, nullc, nullc,nullc, nullc,nullc, nullc},
    {new BlackChecker(5,0), nullc, new BlackChecker(5,2),nullc, new BlackChecker(5,4), nullc, new BlackChecker(5,6), nullc},
    {nullc, new BlackChecker(6,1), nullc, new BlackChecker(6,3), nullc, new BlackChecker(6,5), nullc, new BlackChecker(6,7)},
    {new BlackChecker(7,0), nullc, new BlackChecker(7,2),nullc, new BlackChecker(7,4), nullc, new BlackChecker(7,6), nullc}};

    for(int r = 0; r < checkerArray.length; r++){
    List <Checker> row = new ArrayList <Checker>();
    for(int c = 0; c < checkerArray[r].length; c++){
    row.add(checkerArray[r][c]);
    }
    this.checkerList.add(row);
    }


    The problem I have now is the list stores fine in Firebase database. However, when I retrieve the whole list from the database, the subclasses are not subclasses anymore.



        refThisRoom.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    if(dataSnapshot.getValue(Room.class).getPlayer2() != null){
    turn = dataSnapshot.getValue(Room.class).getTurn();
    checkerList = dataSnapshot.getValue(Room.class).getCheckerList();

    for(int r = 0; r < checkerList.size(); r++){
    Log.d("checkerList", "row" + String.valueOf(r));
    Log.d("checkerList", "rowSize" + String.valueOf(checkerList.size()));
    for(int c = 0; c < checkerList.get(r).size(); c++){
    Log.d("checkerList", "Column" + String.valueOf(c));
    Log.d("checkerList", "ColumnSize" + String.valueOf(checkerList.get(r).size()));
    Log.d("checkerList","hello: "+checkerList.get(r).get(c).getClass().getSimpleName());
    }

    }
    Toast.makeText(BlackCheckerActivity.this,"Player Entered",Toast.LENGTH_LONG).show();
    updateAllButtons();
    disableButtons();
    }
    else{
    Toast.makeText(BlackCheckerActivity.this,"Waiting for another player",Toast.LENGTH_LONG).show();
    }
    }

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

    }
    });


    Instead of returning BlackChecker, RedChecker, and NullChecker, it is just returning checker. I am stuck now because I am using instanceof to determine each checker's move.










    share|improve this question



























      0












      0








      0








      I have been building a multiplayer checker game for my class project.
      The below code is in Room class because every game should have a checkerboard.



      I converted to 2D List because Firebase does not serialize arrays.



      Each of object stored in the list is a subclass of Checker, including nullc (a substitute for null). The reason why I store nullc in the list is that the list has two rows consist of only nulls, and Firebase does not store the index of those two rows.



      this.checkerList = new ArrayList<List<Checker>>();
      Checker nullc = new NullChecker();
      Checker checkerArray = new Checker
      {{nullc, new RedChecker(0,1), nullc, new RedChecker(0,3),
      nullc, new RedChecker(0,5), nullc, new RedChecker(0,7)},
      {new RedChecker(1,0), nullc, new RedChecker(1,2),nullc, new RedChecker(1,4), nullc, new RedChecker(1,6), nullc},
      {nullc, new RedChecker(2,1), nullc, new RedChecker(2,3), nullc, new RedChecker(2,5), nullc, new RedChecker(2,7)},
      {nullc, nullc, nullc, nullc,nullc, nullc,nullc, nullc},
      {nullc, nullc, nullc, nullc,nullc, nullc,nullc, nullc},
      {new BlackChecker(5,0), nullc, new BlackChecker(5,2),nullc, new BlackChecker(5,4), nullc, new BlackChecker(5,6), nullc},
      {nullc, new BlackChecker(6,1), nullc, new BlackChecker(6,3), nullc, new BlackChecker(6,5), nullc, new BlackChecker(6,7)},
      {new BlackChecker(7,0), nullc, new BlackChecker(7,2),nullc, new BlackChecker(7,4), nullc, new BlackChecker(7,6), nullc}};

      for(int r = 0; r < checkerArray.length; r++){
      List <Checker> row = new ArrayList <Checker>();
      for(int c = 0; c < checkerArray[r].length; c++){
      row.add(checkerArray[r][c]);
      }
      this.checkerList.add(row);
      }


      The problem I have now is the list stores fine in Firebase database. However, when I retrieve the whole list from the database, the subclasses are not subclasses anymore.



          refThisRoom.addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
      if(dataSnapshot.getValue(Room.class).getPlayer2() != null){
      turn = dataSnapshot.getValue(Room.class).getTurn();
      checkerList = dataSnapshot.getValue(Room.class).getCheckerList();

      for(int r = 0; r < checkerList.size(); r++){
      Log.d("checkerList", "row" + String.valueOf(r));
      Log.d("checkerList", "rowSize" + String.valueOf(checkerList.size()));
      for(int c = 0; c < checkerList.get(r).size(); c++){
      Log.d("checkerList", "Column" + String.valueOf(c));
      Log.d("checkerList", "ColumnSize" + String.valueOf(checkerList.get(r).size()));
      Log.d("checkerList","hello: "+checkerList.get(r).get(c).getClass().getSimpleName());
      }

      }
      Toast.makeText(BlackCheckerActivity.this,"Player Entered",Toast.LENGTH_LONG).show();
      updateAllButtons();
      disableButtons();
      }
      else{
      Toast.makeText(BlackCheckerActivity.this,"Waiting for another player",Toast.LENGTH_LONG).show();
      }
      }

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

      }
      });


      Instead of returning BlackChecker, RedChecker, and NullChecker, it is just returning checker. I am stuck now because I am using instanceof to determine each checker's move.










      share|improve this question
















      I have been building a multiplayer checker game for my class project.
      The below code is in Room class because every game should have a checkerboard.



      I converted to 2D List because Firebase does not serialize arrays.



      Each of object stored in the list is a subclass of Checker, including nullc (a substitute for null). The reason why I store nullc in the list is that the list has two rows consist of only nulls, and Firebase does not store the index of those two rows.



      this.checkerList = new ArrayList<List<Checker>>();
      Checker nullc = new NullChecker();
      Checker checkerArray = new Checker
      {{nullc, new RedChecker(0,1), nullc, new RedChecker(0,3),
      nullc, new RedChecker(0,5), nullc, new RedChecker(0,7)},
      {new RedChecker(1,0), nullc, new RedChecker(1,2),nullc, new RedChecker(1,4), nullc, new RedChecker(1,6), nullc},
      {nullc, new RedChecker(2,1), nullc, new RedChecker(2,3), nullc, new RedChecker(2,5), nullc, new RedChecker(2,7)},
      {nullc, nullc, nullc, nullc,nullc, nullc,nullc, nullc},
      {nullc, nullc, nullc, nullc,nullc, nullc,nullc, nullc},
      {new BlackChecker(5,0), nullc, new BlackChecker(5,2),nullc, new BlackChecker(5,4), nullc, new BlackChecker(5,6), nullc},
      {nullc, new BlackChecker(6,1), nullc, new BlackChecker(6,3), nullc, new BlackChecker(6,5), nullc, new BlackChecker(6,7)},
      {new BlackChecker(7,0), nullc, new BlackChecker(7,2),nullc, new BlackChecker(7,4), nullc, new BlackChecker(7,6), nullc}};

      for(int r = 0; r < checkerArray.length; r++){
      List <Checker> row = new ArrayList <Checker>();
      for(int c = 0; c < checkerArray[r].length; c++){
      row.add(checkerArray[r][c]);
      }
      this.checkerList.add(row);
      }


      The problem I have now is the list stores fine in Firebase database. However, when I retrieve the whole list from the database, the subclasses are not subclasses anymore.



          refThisRoom.addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
      if(dataSnapshot.getValue(Room.class).getPlayer2() != null){
      turn = dataSnapshot.getValue(Room.class).getTurn();
      checkerList = dataSnapshot.getValue(Room.class).getCheckerList();

      for(int r = 0; r < checkerList.size(); r++){
      Log.d("checkerList", "row" + String.valueOf(r));
      Log.d("checkerList", "rowSize" + String.valueOf(checkerList.size()));
      for(int c = 0; c < checkerList.get(r).size(); c++){
      Log.d("checkerList", "Column" + String.valueOf(c));
      Log.d("checkerList", "ColumnSize" + String.valueOf(checkerList.get(r).size()));
      Log.d("checkerList","hello: "+checkerList.get(r).get(c).getClass().getSimpleName());
      }

      }
      Toast.makeText(BlackCheckerActivity.this,"Player Entered",Toast.LENGTH_LONG).show();
      updateAllButtons();
      disableButtons();
      }
      else{
      Toast.makeText(BlackCheckerActivity.this,"Waiting for another player",Toast.LENGTH_LONG).show();
      }
      }

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

      }
      });


      Instead of returning BlackChecker, RedChecker, and NullChecker, it is just returning checker. I am stuck now because I am using instanceof to determine each checker's move.







      java android firebase android-studio android-gson






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 14 '18 at 15:49







      user9281765

















      asked Nov 14 '18 at 3:29









      user9281765user9281765

      92




      92
























          1 Answer
          1






          active

          oldest

          votes


















          0














          I solved the issue by adding another field called "type" of type string to the parent class in the constructor. For the subclasses, when I create a subclass, I wrote



               new RedChecker(row, column, "RedChecker")
          new BlackChecker(row, column, "BlackerChecker")
          new NullChecker(row, column, "NullChecker").


          When retrieving the list of Checker class back, I replaced all the superclass in the object with newly initiated subclasses. Something like



              if(checkerList.get(r).get(c).getType().equals("Red/Black/NullChecker")){
          checkerList.get(r).set(c, new Red/Black/NullChecker(checkerList.get(r).get(c).getRow(), checkerList.get(r).get(c).getColumn(), checkerList.get(r).get(c).getType())
          }





          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53292776%2fstore-and-fetch-a-2-d-list-of-different-sub-classes-to-google-firebase%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            I solved the issue by adding another field called "type" of type string to the parent class in the constructor. For the subclasses, when I create a subclass, I wrote



                 new RedChecker(row, column, "RedChecker")
            new BlackChecker(row, column, "BlackerChecker")
            new NullChecker(row, column, "NullChecker").


            When retrieving the list of Checker class back, I replaced all the superclass in the object with newly initiated subclasses. Something like



                if(checkerList.get(r).get(c).getType().equals("Red/Black/NullChecker")){
            checkerList.get(r).set(c, new Red/Black/NullChecker(checkerList.get(r).get(c).getRow(), checkerList.get(r).get(c).getColumn(), checkerList.get(r).get(c).getType())
            }





            share|improve this answer




























              0














              I solved the issue by adding another field called "type" of type string to the parent class in the constructor. For the subclasses, when I create a subclass, I wrote



                   new RedChecker(row, column, "RedChecker")
              new BlackChecker(row, column, "BlackerChecker")
              new NullChecker(row, column, "NullChecker").


              When retrieving the list of Checker class back, I replaced all the superclass in the object with newly initiated subclasses. Something like



                  if(checkerList.get(r).get(c).getType().equals("Red/Black/NullChecker")){
              checkerList.get(r).set(c, new Red/Black/NullChecker(checkerList.get(r).get(c).getRow(), checkerList.get(r).get(c).getColumn(), checkerList.get(r).get(c).getType())
              }





              share|improve this answer


























                0












                0








                0







                I solved the issue by adding another field called "type" of type string to the parent class in the constructor. For the subclasses, when I create a subclass, I wrote



                     new RedChecker(row, column, "RedChecker")
                new BlackChecker(row, column, "BlackerChecker")
                new NullChecker(row, column, "NullChecker").


                When retrieving the list of Checker class back, I replaced all the superclass in the object with newly initiated subclasses. Something like



                    if(checkerList.get(r).get(c).getType().equals("Red/Black/NullChecker")){
                checkerList.get(r).set(c, new Red/Black/NullChecker(checkerList.get(r).get(c).getRow(), checkerList.get(r).get(c).getColumn(), checkerList.get(r).get(c).getType())
                }





                share|improve this answer













                I solved the issue by adding another field called "type" of type string to the parent class in the constructor. For the subclasses, when I create a subclass, I wrote



                     new RedChecker(row, column, "RedChecker")
                new BlackChecker(row, column, "BlackerChecker")
                new NullChecker(row, column, "NullChecker").


                When retrieving the list of Checker class back, I replaced all the superclass in the object with newly initiated subclasses. Something like



                    if(checkerList.get(r).get(c).getType().equals("Red/Black/NullChecker")){
                checkerList.get(r).set(c, new Red/Black/NullChecker(checkerList.get(r).get(c).getRow(), checkerList.get(r).get(c).getColumn(), checkerList.get(r).get(c).getType())
                }






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 15 '18 at 3:54









                user9281765user9281765

                92




                92






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53292776%2fstore-and-fetch-a-2-d-list-of-different-sub-classes-to-google-firebase%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Bressuire

                    Vorschmack

                    Quarantine