propoLis
propoLis

Reputation: 1283

How to create a new relational realmResults?

I created a realm object(VolleyballPlayer) according to other realm objects. Female object includes all Volleyball objects but Male object has some Volleyball objects.

I want to create VolleyballPlayer object that group Female and Male objects for gender. But I couldn't find how to do it according to RealmResults.

My realm objects:

public class Volleyball extends RealmObject {
    private int round;
    // ... Generated getters and setters ...
}

//...All  females play volleyball.
public class Female extends RealmObject {
    private Volleyball volleyball;
    private int clasp;
    // ... Generated getters and setters ...
}

public class Male extends RealmObject {
    private Volleyball volleyball;
    private int belt;
    // ... Generated getters and setters ...
}

New object:

public class VolleyballPlayer extends RealmObject {
    private Volleyball volleyball;
    private String gender;

    // ... Generated getters and setters ...
}

I have allFemale and allMale realmResults but I haven't take allPlayer realmResults.

RealmResults<Female> allFemales = mRealm.where(Female.class).findAll();
RealmResults<Male> allMales = mRealm.where(Male.class).findAll();

All female students play volleyball and how can I extract male players from through all the players(in females) who play volleyball? Is there a way in the realm that I write below code:

 public void setAllVolleyballPlayers(Realm mRealm) {
        Realm mRealm = getRealm();

        mRealm.beginTransaction();
        addAllMalePlayers(mRealm);
        addAllFemalePlayers(mRealm);
        mRealm.commitTransaction();
    }

    private void addAllMalePlayers(Realm mRealm) {
        RealmResults<Male> allMalePlayers = new MalePlayersQueries().getAllMales(mRealm);

        mRealm.beginTransaction();

        if (allMalePlayers != null && allMalePlayers.size() > 0) {

           VolleyballPlayer volleyballPlayer = mRealm.createObject(VolleyballPlayer.class);
           volleyballPlayer.setGender(getString(R.string.male));

           for (Male male : allMales) {
            
           VolleyballPlayer volleyballPlayer = 
           mRealm.createObject(VolleyballPlayer.class);
           volleyballPlayer.setVolleyball(male.getVolleyball());
           }
        }
    }

   private void addAllFemalePlayers(Realm mRealm) {
           RealmResults<Female> allFemales = new FemaleQueries().getAllPlayers(mRealm);

           VolleyballPlayer volleyballPlayer = mRealm.createObject(VolleyballPlayer.class);
           volleyballPlayer.setGender(getString(R.string.female));

           ////// All female students play volleyball and how can I extract male players from all the players(in females) who play this volleyball and get females
}

And I want to show at the end of table:

  **Volleyball Players**
    
  **Female**
    Emma
    Olivia
    Sophia

  **Male**
    John
    Jame

Upvotes: 0

Views: 485

Answers (1)

EpicPandaForce
EpicPandaForce

Reputation: 81539

Personally I'd leverage the power of "single-table-inheritance using discriminator field" for this.

public class Volleyball extends RealmObject {
    private int round;

    @LinkingObjects("volleyball")
    private final RealmResults<VolleyBallPlayer> playedBy = null;
    // ... Generated getters and setters ...
}

public class VolleyBallPlayer extends RealmObject {
    private Volleyball volleyball;
    @Index
    private String gender;
    private int femaleClasp; // 0, or with Integer `null` if male
    private int maleBelt; // 0, or with Integer `null` if female
    // ... Generated getters and setters ...
}

Now you can do

RealmResults<VolleyBallPlayer> femalePlayers = realm.where(VolleyBallPlayer.class)
     .equalTo("gender", Gender.FEMALE.name()).findAll();
RealmResults<VolleyBallPlayer> malePlayers = realm.where(VolleyBallPlayer.class)
     .equalTo("gender", Gender.MALE.name()).findAll();

And even

RealmResults<Volleyball> maleVolleyballs = realm.where(Volleyball.class)
     .equalTo("playedBy.gender", Gender.MALE.name()).findAll();

Upvotes: 2

Related Questions