Unable to query documents in Atlas cluster

I am trying to query documents in an Atlas cluster, specifically from my AppUser collection. The intended functionality is that a user logs in and then their respective AppUser would be queried; I would be able to log in to any account on any device.

However, I was encountering many issues. See the code:

Credentials credentials = Credentials.emailPassword(email, password);
app.loginAsync(credentials, result -> {
   SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser(), PARTITION)
	.waitForInitialRemoteData().build();
   realm = Realm.getInstance(config);

   RealmResults<AppUser> users = realm.where(AppUser.class).findAll();
   AppUser user = null;

   // Find the AppUser with the email
   for (int i = 0; i < users.size(); i++) {
      if (users.get(i).getEmail().equals(email)) {
         user = users.get(i);
      }
   }
   if (user == null) Log.wtf("EXAMPLE", "This should NEVER happen."); // but it happens anyway, causing the exception below
   String type = user.getUserType(); // *** EXCEPTION here ***
   // ...
});

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.jchan.testing, PID: 13568
java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.String com.jchan.testing.AppUser.getUserType()’ on a null object reference
at com.jchan.testing.MainActivity.lambda$onCreate$0$com-jchan-testing-MainActivity(MainActivity.java:120)
at com.jchan.testing.MainActivity$$ExternalSyntheticLambda2.onResult(Unknown Source:6)
at io.realm.internal.mongodb.Request$3.run(Request.java:90)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Supposedly, the ‘jchan’ AppUser should have been queried after entering the credentials for the ‘jchan’ User. The code above does work; locally that is. However, after wiping my emulator, reinstalling, and attempting to log in with the same credentials, I get the above exception. I did not have problems registering a User and AppUser into the database using a synced realm though. That brings me to one question:

Why isn’t the synced realm getting documents from my remote Atlas cluster?

Maybe it can only upload documents and can’t download them, but I’m certain this isn’t the case. I have tried:

  • Terminating and reinitializing sync (did this with the other below fixes)
  • Wiping the emulator and reinstalling (did this with the other below fixes)
  • Deleting all schema configurations and the databases in the cluster (would then use development mode to get them back)
  • Invalidating caches in Android Studio
  • Looking for similar issues other people had (a few hours of browsing, none of them helped)

Next, I tried to query the cluster directly by referring to this documentation. But of course, it still doesn’t work:

Credentials credentials = Credentials.emailPassword(email, password);
app.loginAsync(credentials, result -> {
   MongoClient mongoClient = app.currentUser().getMongoClient("mongodb-atlas");
   MongoDatabase mongoDatabase = mongoClient.getDatabase("MyDB");
   CodecRegistry pojoCodecRegistry = fromRegistries(AppConfiguration.DEFAULT_BSON_CODEC_REGISTRY,
      fromProviders(PojoCodecProvider.builder().automatic(true).build()));
   MongoCollection<AppUser> mongoCollection = mongoDatabase.getCollection("AppUser", AppUser.class)
      .withCodecRegistry(pojoCodecRegistry);
   Document queryFilter = new Document("email", email);
   AppUser user = mongoCollection.findOne(queryFilter).get(); // *** EXCEPTION here ***
   String type = user.getUserType();
   // ...
});

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.jchan.testing, PID: 13389
NETWORK_UNKNOWN(realm::app::CustomError:1002)
android.os.NetworkOnMainThreadException
at io.realm.internal.network.NetworkRequest.resultOrThrow(NetworkRequest.java:84)
at io.realm.internal.objectstore.OsMongoCollection.findOneInternal(OsMongoCollection.java:274)
at io.realm.internal.objectstore.OsMongoCollection.findOne(OsMongoCollection.java:224)
at io.realm.mongodb.mongo.MongoCollection$6.run(MongoCollection.java:236)
at io.realm.internal.async.RealmResultTaskImpl.get(RealmResultTaskImpl.java:92)
at com.jchan.testing.MainActivity.lambda$onCreate$0$com-jchan-testing-MainActivity(MainActivity.java:126)
at com.jchan.testing.MainActivity$$ExternalSyntheticLambda2.onResult(Unknown Source:6)
at io.realm.internal.mongodb.Request$3.run(Request.java:90)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

    at io.realm.internal.network.NetworkRequest.resultOrThrow(NetworkRequest.java:84)
    at io.realm.internal.objectstore.OsMongoCollection.findOneInternal(OsMongoCollection.java:274)
    at io.realm.internal.objectstore.OsMongoCollection.findOne(OsMongoCollection.java:224)
    at io.realm.mongodb.mongo.MongoCollection$6.run(MongoCollection.java:236)
    at io.realm.internal.async.RealmResultTaskImpl.get(RealmResultTaskImpl.java:92)
    at com.jchan.testing.MainActivity.lambda$onCreate$0$com-jchan-testing-MainActivity(MainActivity.java:126)
    at com.jchan.testing.MainActivity$$ExternalSyntheticLambda2.onResult(Unknown Source:6)
    at io.realm.internal.mongodb.Request$3.run(Request.java:90)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

I’m not sure why this didn’t work. If anyone can help me with this, I would give my utmost appreciation.