Store data into Realm through Retrofit 2

2019-06-02 21:45发布

问题:

I am new for Realm integration. I am trying to save my retrofit json response into Realm database. But still I am confuse how to complete this task for retrofit 2.

I am getting json response and extends RealmObject class as per RealM documents. but still not getting any good way to store my response into realm directly.

Dashboard Activity:

  apiInterface = APIClient.getClient().create(APIInterface.class);
        final Call<RealmList<ExampleTest>> call = apiInterface.getSurvay();
    call.enqueue(new Callback<RealmList<ExampleTest>>() {
        @Override
        public void onResponse(Call<RealmList<ExampleTest>> call, Response<RealmList<ExampleTest>> response) {   

    resource = response.body();

Log.d(" response "," success ");

            }

API client :

{ 
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();


retrofit = new Retrofit.Builder()
        .baseUrl("** my URL **")
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build();


return retrofit;
}

build.gradle:

compile ('com.squareup.retrofit2:retrofit:2.1.0') {
        exclude module: 'okhttp'
    }
    compile 'com.google.code.gson:gson:2.6.2'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
    compile 'com.squareup.okhttp3:okhttp:3.4.1'

POJO class:

ExampleTest:

public class ExampleTest extends RealmObject {

        @SerializedName("Id")
        @Expose
        private Integer id;
        @SerializedName("name")
        @Expose
        private String surveyName;
        @SerializedName("Language_id")
        @Expose
        private Integer languageId;
        @SerializedName("image")
        @Expose
        private String surveyImage;
        @SerializedName("description")
        @Expose
        private String surveyDescription;
        @SerializedName("ListQuestion")
        @Expose
        private RealmList<ListQuestion> listQuestion = null;

        public Integer getId() {
            return id;
        }

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

        public String getSurveyName() {
            return surveyName;
        }

        public void setSurveyName(String surveyName) {
            this.surveyName = surveyName;
        }

        public Integer getLanguageId() {
            return languageId;
        }

        public void setLanguageId(Integer languageId) {
            this.languageId = languageId;
        }

        public String getSurveyImage() {
            return surveyImage;
        }

        public void setSurveyImage(String surveyImage) {
            this.surveyImage = surveyImage;
        }

        public String getSurveyDescription() {
            return surveyDescription;
        }

        public void setSurveyDescription(String surveyDescription) {
            this.surveyDescription = surveyDescription;
        }

        public RealmList<ListQuestion> getListQuestion() {
            return listQuestion;
        }

        public void setListQuestion(RealmList<ListQuestion> listQuestion) {
            this.listQuestion = listQuestion;
        }

  }

ListQuestion:

public class ListQuestion extends RealmObject {

    @SerializedName("Id")
    @Expose
    private Integer id;
    @SerializedName("Question_text")
    @Expose
    private String questionText;
    @SerializedName("Answer_type_id")
    @Expose
    private Integer answerTypeId;
    @SerializedName("Answer_type")
    @Expose
    private String answerType;

    public Integer getId() {
        return id;
    }

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

    public String getQuestionText() {
        return questionText;
    }

    public void setQuestionText(String questionText) {
        this.questionText = questionText;
    }

    public Integer getAnswerTypeId() {
        return answerTypeId;
    }

    public void setAnswerTypeId(Integer answerTypeId) {
        this.answerTypeId = answerTypeId;
    }

    public String getAnswerType() {
        return answerType;
    }

    public void setAnswerType(String answerType) {
        this.answerType = answerType;
    }

RealM:

private void initRealm() {
        Realm.init(this);
        RealmConfiguration config = new RealmConfiguration.Builder()
                .name("books.realm")
                .schemaVersion(1)
                .deleteRealmIfMigrationNeeded()
                .build();
        Realm.setDefaultConfiguration(config);


    }

Please help me how can I store my json response into realm through retrofit 2.

回答1:

I got my answer from Realm official website and other blogs.

My above code is working perfect. Just need to add Realm functionality properly.

In Activity : Dashboard

call.enqueue(new Callback<RealmList<ExampleTest>>() {
            @Override
            public void onResponse(Call<RealmList<ExampleTest>> call, Response<RealmList<ExampleTest>> response) {

                resource = response.body();


              Realm.init(DashboardActivity.this);
              config = new RealmConfiguration.Builder()
                        .name("books.realm")
                        .schemaVersion(1)
                        .deleteRealmIfMigrationNeeded()
                        .build();
                Realm.setDefaultConfiguration(config);


              // add response to realm database
                Realm realm = Realm.getInstance(config);
                realm.beginTransaction();
                realm.copyToRealmOrUpdate(resource);
                realm.commitTransaction();
                realm.close();


// programmatically check : data is inserted in to realm or not

                int notesCount = realm.where(ExampleTest.class).findAll().size();
                int notesCount2 = realm.where(ListConditionalQuestion.class).findAll().size();
                int notesCount3 = realm.where(LstHotSpot.class).findAll().size();

                Log.d("my first",String.valueOf(notesCount));
                Log.d("my second",String.valueOf(notesCount2));
                Log.d("my 33333",String.valueOf(notesCount3));


            }


            @Override
            public void onFailure(Call<RealmList<ExampleTest>> call, Throwable t) {

   Log.d("fail","response fail");

            }
        });