0

How do I persist the data that has been parsed from the server using Retrofit library. So that users can view it when there is no internet connection.

    final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.post_recycler_view);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    ApiInterface apiService =
            ApiClient.getClient().create(ApiInterface.class);

    Call<ArrayList<Post>> call = apiService.getAllPosts();
    call.enqueue(new Callback<ArrayList<Post>>() {
        @Override
        public void onResponse(Call<ArrayList<Post>> call, Response<ArrayList<Post>> response) {
            int statusCode = response.code();
            List<Post> posts = response.body();
            recyclerView.setAdapter(new PostListAdapter(posts, R.layout.activity_main, getApplicationContext()));

        }

        @Override
        public void onFailure(Call<ArrayList<Post>> call, Throwable t) {
            Log.e(TAG, t.toString());

        }
    });

I want to save response, persist and show data into RecyclerView. Help to save using ORM will be appreciated, I try to use Sugar ORM and ActiveAndroid but I can not succeed on that :(

When I extend SugarRecord or Model App terminate without any error on log cat

Jon Goodwin
  • 9,053
  • 5
  • 35
  • 54
Hemraj Rijal
  • 65
  • 1
  • 2
  • 12
  • Can you link a gist with your sugarorm option of the code? Minimal example of the project people can have a look at? – Ivan Mar 16 '17 at 04:51
  • https://gist.github.com/HemrajRijal/27851ee3ddd2eec4e80344c372725103 Model gist link with integration of sugar ORM @Ivan – Hemraj Rijal Mar 16 '17 at 05:13
  • have you tried putting a breakpoint in all the callback lines as well as api creation and stepping through the code in debug? which lines are being executed? which are not? when the termination happens? if you're lucky when the exception happen, you will be able to see it in higher level handler – Ivan Mar 16 '17 at 09:33

1 Answers1

0

After copious research, I succeed to persist the response parsed using Retrofit. I have used Realm to persist the data for offline use. I will describe the methods I had implemented which may help other to encounter this type of problems.

1. Add Realm Dependencies to Gradle

App-level Gradle file

`apply plugin: 'realm-android'` 

repositories {
    maven { url "https://jitpack.io" }
}

classpath "io.realm:realm-gradle-plugin:1.2.0" --> on project level gradle file

2. Extends RealmObject

public class Post extends RealmObject {
    @SerializedName("userId")
    @Expose
    private Integer userId;

    @SerializedName("id")
    @Expose
    private Integer id;

    @SerializedName("title")
    @Expose
    private String title;

    @SerializedName("body")
    @Expose
    private String body;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }
}

3. Create Realm Configuration if not exist

if (realmConfiguration == null) {
            realmConfiguration = new RealmConfiguration.Builder(this)
                    .build();
        }
        realm = Realm.getInstance(realmConfiguration);

4. Save parsed Data

Call<List<Post>> call = apiService.getAllPosts();
        call.enqueue(new Callback<List<Post>>() {
            @Override
            public void onResponse(Call<List<Post>> call, Response<List<Post>> response) {
                closeProgress();
                if (response.isSuccessful()) {
                    List<Post> posts = response.body();
                    mRecyclerView.setAdapter(new PostAdapter(posts, R.layout.activity_main, getApplicationContext()));
                    for (int i = 0; i < posts.size(); i++) {
                        realm.beginTransaction();
                        Post post = realm.createObject(Post.class);
                        post.setUserId(posts.get(i).getUserId());
                        post.setId(posts.get(i).getId());
                        post.setTitle(posts.get(i).getTitle());
                        post.setBody(posts.get(i).getBody());
                        realm.commitTransaction();
                    }
                    mRecyclerView.setVisibility(View.VISIBLE);
                }
            }

            @Override
            public void onFailure(Call<List<Post>> call, Throwable t) {
               t.printStackTrace();
            }
        });

5. Query and Inflate data saved by Realm

RealmResults<Post> posts = realm.where(Post.class).findAll();
            mRecyclerView.setAdapter(new PostAdapter(posts, R.layout.activity_main, getApplicationContext()));
        }

Following the above methods help me to solve my problem and I hope this will help to solve your problem too. If you get any problem implementing the solution, you can ask me on comment

Hemraj Rijal
  • 65
  • 1
  • 2
  • 12