How to collect data from MongoDB in Android Studio?

Viewed 50

I am experimenting with the integration of MongoDB on Android using Java as the language.

I followed the guide provided by MongoDB to configure the Atlas account and the Realm to communicate with. After that I tried implementing CRUD methods, for insertions I did not encounter any problems, while for queries I did. In particular to get all the objects of a certain class in a certain collection.

I used this method, as suggested by the wiki (https://www.mongodb.com/docs/realm/sdk/java/quick-start-local/)

 RealmResults<Contact> contacts = backgroundThreadRealm.where(Contact.class).findAll();

inserted in a class made to handle background tasks:

public class BackgroundTasks implements Runnable {
    @Override
    public void run() {
        String realmName = "MyApp";
        RealmConfiguration config = new RealmConfiguration.Builder().name(realmName).build();
        Realm backgroundThreadRealm = Realm.getInstance(config);

        // all Tasks in the realm
        RealmResults<Contact> contacts = backgroundThreadRealm.where(Contact.class).findAll();

        Log.v("Contacts", String.valueOf(contacts.size()));

        backgroundThreadRealm.close();
    }
}

While in the MainActivity I inserted this (looks like a battlefield, maybe I inserted stuff I won't even need, but I was experimenting):

 // initialize mongodb realm
        realm.init(this);

        // open realm
String realmName = "MyApp";
        RealmConfiguration config = new RealmConfiguration.Builder().name(realmName).build();
        backgroundThreadRealm = Realm.getInstance(config);

app = new App(new AppConfiguration.Builder(appId).build());

User user = app.currentUser();
        mongoClient = user.getMongoClient("mongodb-atlas");
        mongoDatabase = mongoClient.getDatabase("MyApp");
        MongoCollection<Document> mongoCollection = mongoDatabase.getCollection("Contacts");

FutureTask<String> task = new FutureTask(new BackgroundTasks(), "test");
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        executorService.execute(task);
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // the ui thread realm uses asynchronous transactions, so we can only safely close the realm
        // when the activity ends and we can safely assume that those transactions have completed
        backgroundThreadRealm.close();
    }

I get no exceptions but the Log:

Log.v("Contacts", String.valueOf(contacts.size()));

results in 0.

Yet I have these contacts in the DB (they have different IDs):

query

And the related model in java:

@RealmClass
public class Contact extends RealmObject implements Serializable {
    @PrimaryKey
    private String nameSurname;
    private int age;

    // Drawable resource ID
    private int imageResourceId;

    public Contact() {
    }

    public Contact(String name, String surname, int age, int imageResourceId) {
        this.nameSurname = name+" "+surname;
        this.age = age;
        this.imageResourceId = imageResourceId;
    }

// In addition all the getters and setters

Can you help me? It would also help to understand when it's appropriate to make synchronous and asynchronous calls, because I guess I've confused the implementations in general. I'd like to use synchronous calls to get all the objects in the DB and then display them on the app, but it seems ill-advised online so I tried asynchronous, although I'm sure I did something wrong..

Thanks

0 Answers
Related