Search code examples
androidlistviewcouchbase-lite

Couchbase lite on Android, retrieve views


This question is about Couchbase lite (no Sync Gateway).

I'm new to Couchbase, I managed to use the demo app, but I don't understand it completely. It contains this code which (as far as I understand, since I'm not native English speaker) retrieve views to populate a listview with the indexes:

    // This code can be found in ListsActivity.java
    // in the setupViewAndQuery() method
    com.couchbase.lite.View listsView = mDatabase.getView("list/listsByName");
    if (listsView.getMap() == null) {
        listsView.setMap(new Mapper() {
            @Override
            public void map(Map<String, Object> document, Emitter emitter) {
                String type = (String) document.get("type");
                if ("task-list".equals(type)) {
                    emitter.emit(document.get("name"), null);
                }
            }
        }, "1.0");
    }

    listsLiveQuery = listsView.createQuery().toLiveQuery();

Could anyone give me a hand with what each part is doing?

In which step is the listview populated

Can I change "list/listsByName" in the code (line 3)? What would happen?

Can I emit more than one element?


Solution

  • The code is a little bit convoluted. Let's answer the easy parts first.

    Can I change "list/listsByName" in the code (line 3)?

    Yes. That's just the name of the Couchbase View. You choose the View name. Unfortunately the terms used in Couchbase and Android overlap some. A Couchbase View is a kind of static index of your database.

    Can I emit more than one element?

    Yes. You can emit most anything you want. Take a look at the documentation here

    Now, tracing how the Android ListView gets updated:

    In ListsActivity.java notice in the onCreate method a ListAdapter instance gets added to the ListView. This ListAdapter is a private inner class that extends LiveQueryAdapter.

    LiveQueryAdapter is in the utils subpackage. If you look at its constructor, you'll see it adds a change listener to the query passed in. When triggered, this change listener sets an enumerator equal to the rows passed back by the live query, then calls notifyDataSetChanged to tell the list to refresh itself. That, in turn, causes getView in ListAdapter to get called. That's where the data is pulled from the database and used to populate a list entry.