Retrofit2 и DBFlow для чтения сведений о сохранении и сущности

Я использую retrofit2 для сетевых запросов на какой-то ресурс. Ожидается соответствующий ответ:

{
            "coach_details":[
            {
                "coach_id": 8,
                "academy_id": 1,
                "username": "[email protected]",
                "first_name": "David",
                "last_name": "test",
                "gender": "male",
                "email": "",
                "mobile": "", 
                "middle_name": "",
                "nick_name": "", 
                "state": "3"
            }
            ],
            "status": 1,
            "message": "success"
        }

        or

        {
            "status": 0,
            "message": "Oops! Invalid username or password!"
        }

Это конечная точка входа в мое приложение, и впоследствии я добавил DBFLow в качестве базы данных ORM. Я использую один и тот же класс модели как для DBFlow, так и для модификации 2, как показано ниже:

Класс тренера, который является основным ответом:

public class Coach {

private String status;
private String message;

@SerializedName("coach_details")
private CoachDetails coachDetails;

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public String getMessage() {
    return message;
}

public void setMessage(String message) {
    this.message = message;
}

public CoachDetails getCoachDetails() {
    return coachDetails;
}

public void setCoachDetails(CoachDetails coachDetails) {
    this.coachDetails = coachDetails;
}
}

и данные тренера, которые необходимо сохранить

@Table(database = SportsDatabase.class)
public class CoachDetails extends BaseModel {

@SerializedName("coach_id")
@PrimaryKey
@Column
public String coachId;

@SerializedName("academy_id")
public String academyId;

@SerializedName("username")
public String username;

@SerializedName("first_name")
public String firstName;

@SerializedName("last_name")
public String lastName;

@SerializedName("gender")
public String gender;

@SerializedName("mobile")
public String mobileNum;

@SerializedName("email")
public String emailAddr;

@SerializedName("middle_name")
public String midName;

@SerializedName("nick_name")
public String nickName;

@SerializedName("state")
public String originState;

public CoachDetails() {
}

public String getCoachId() {
    return coachId;
}

public void setCoachId(String coachId) {
    this.coachId = coachId;
}

public String getAcademyId() {
    return academyId;
}

public void setAcademyId(String academyId) {
    this.academyId = academyId;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getGender() {
    return gender;
}

public void setGender(String gender) {
    this.gender = gender;
}

public String getMobileNum() {
    return mobileNum;
}

public void setMobileNum(String mobileNum) {
    this.mobileNum = mobileNum;
}

public String getEmailAddr() {
    return emailAddr;
}

public void setEmailAddr(String emailAddr) {
    this.emailAddr = emailAddr;
}

public String getMidName() {
    return midName;
}

public void setMidName(String midName) {
    this.midName = midName;
}

public String getNickName() {
    return nickName;
}

public void setNickName(String nickName) {
    this.nickName = nickName;
}

public String getOriginState() {
    return originState;
}

public void setOriginState(String originState) {
    this.originState = originState;
}

public void insertInfo(String coach_id, String acadId, String username, String first, String last, String gender, String mobile, String mid_name, String nick, String state) {
    this.coachId = coach_id;
    this.academyId = acadId;
    this.username = username;
    this.firstName = first;
    this.lastName = last;
    this.gender = gender;
    this.mobileNum = mobile;
    this.midName = mid_name;
    this.nickName = nick;
    this.originState = state;
}
}

и в своей деятельности я попытался сохранить после сетевого вызова, как показано ниже, а также попытался проверить чтение из базы данных, но получил нулевые значения в журнале. Правильно ли выполнено мое сохранение или мой запрос на чтение неверен? Образец кода:

private void attemptLogin(String username, String pwd) {
    Call<Coach> call = RestClient.getRestInstance()
            .getLoginService()
            .loginCoach("[email protected]", "123@abcd"); // TODO: 12/17/2018 Use input values

    call.enqueue(new Callback<Coach>() {
        @Override
        public void onResponse(Call<Coach> call, Response<Coach> response) {
            if (response.isSuccessful()) {

                Coach coach = response.body();

                coach_id = coach.getCoachDetails().getCoachId();

                String acadId = coach.getCoachDetails().getAcademyId();
                String username = coach.getCoachDetails().getUsername();
                String first = coach.getCoachDetails().getFirstName();
                String last = coach.getCoachDetails().getLastName();
                String gender = coach.getCoachDetails().getGender();
                String mobile = coach.getCoachDetails().getMobileNum();
                String email = coach.getCoachDetails().getEmailAddr();
                String mid_name = coach.getCoachDetails().getMidName();
                String nick = coach.getCoachDetails().getNickName();
                String state = coach.getCoachDetails().getOriginState();
 //                    Log.d(TAG, "State:\t" + state);

                CoachDetails coachDetails = new CoachDetails();
//                    coachDetails.insertInfo(coach_id, acadId, username, first, last, gender, mobile, mid_name, nick, state);
                coachDetails.setCoachId(coach_id);
                coachDetails.setAcademyId(acadId);
                coachDetails.setFirstName(first);
                coachDetails.setLastName(last);
                coachDetails.setGender(gender);
                coachDetails.setMobileNum(mobile);
                coachDetails.setEmailAddr(email);
                coachDetails.setMidName(mid_name);
                coachDetails.setNickName(nick);
                coachDetails.setOriginState(state);
                coachDetails.save();

 //                    CoachDetails details = SQLite.select()
 //                            .from(CoachDetails.class)
//                            .querySingle();

 //                    Log.d(TAG, "CId from db:\t" + details.getCoachId() + " first_name:\t" + details.getFirstName()); // name is null and id is showing properly

 //                    startActivity(new Intent(LoginActivity.this, MainActivity.class));
            } else {
                Snackbar.make(findViewById(android.R.id.content), "Login Failed with Error Code:\t" + response.code(),
                        Snackbar.LENGTH_LONG).show();
                loginBtn.setEnabled(true);
            }
        }

        @Override
        public void onFailure(Call<Coach> call, Throwable t) {
            Snackbar.make(findViewById(android.R.id.content), "Unable to Login...Check Your Connection or Credentials",
                    Snackbar.LENGTH_LONG).show();
        }
    });
}

Может ли кто-нибудь указать, где это происходит не так?


person Darth Plagueris    schedule 18.12.2018    source источник
comment
первое, что ваш тренер - это массив, а не сущность в ответ.   -  person Moinkhan    schedule 18.12.2018
comment
Я все еще могу получить поля из ответа, я проверил, что проблема заключается в сохранении или чтении данных.   -  person Darth Plagueris    schedule 18.12.2018
comment
как это возможно, убедитесь, что вы разместили правильный формат json в приведенном выше примере ..?   -  person Moinkhan    schedule 18.12.2018
comment
можешь показать Coach класс ??   -  person Moinkhan    schedule 18.12.2018
comment
Хорошо, я отредактировал, чтобы показать класс Coach. Спасибо что подметил это   -  person Darth Plagueris    schedule 18.12.2018
comment
все еще сбивает с толку .. почему в классе Coach ваш coach_details является объектом, а не массивом. а в json его массив...!!!   -  person Moinkhan    schedule 18.12.2018
comment
Я думаю, что это ошибка в ответе json и недосмотр с моей стороны, поскольку данные для входа предназначены только для одного пользователя и не должны быть массивом   -  person Darth Plagueris    schedule 18.12.2018


Ответы (2)


Я исправил эту проблему, добавив аннотацию @Column к оставшимся полям в моем классе модели. Проблема заключалась в том, что я перешел из ActiveAndroid to DBFlow и забыл правильно аннотировать свои поля перед их вызовом.

Я получаю желаемый результат сейчас.

person Darth Plagueris    schedule 18.12.2018

Правильно ли выполнено мое сохранение или мой запрос на чтение неверен?

Попробуйте решение ниже...

 private void attemptLogin(String username, String pwd) {
    Call<Coach> call = RestClient.getRestInstance()
            .getLoginService()
            .loginCoach("[email protected]", "123@abcd"); // TODO: 12/17/2018 Use input values

    call.enqueue(new Callback<Coach>() {
        @Override
        public void onResponse(Call<Coach> call, Response<Coach> response) {
            if (response.isSuccessful()) {


                updateData(response.body())


            } else {
                Snackbar.make(findViewById(android.R.id.content), "Login Failed with Error Code:\t" + response.code(),
                        Snackbar.LENGTH_LONG).show();
                loginBtn.setEnabled(true);
            }
        }

        @Override
        public void onFailure(Call<Coach> call, Throwable t) {
            Snackbar.make(findViewById(android.R.id.content), "Unable to Login...Check Your Connection or Credentials",
                    Snackbar.LENGTH_LONG).show();
        }
    });
}



private void updateData(Coach coach){

     coach_id = coach.getCoachDetails().getCoachId();

     new MyAsyncTask (this,coach.getCoachDetails()).execute();


     //add here AsynTask and save this `coachDetails` object inside the `doBackground()` method.

}

Примечание. Попробуйте выполнить всю работу с базой данных в каком-либо фоновом потоке, иначе вы получите ошибку ANR на каком-либо устройстве. Поскольку вы выполняете все операции в потоке пользовательского интерфейса.

Пример:-

 class MyAsyncTask extends AsyncTask<String, Void, String> {

        private Context context;
        private CoachDetails coachDetails;

        public MyAsyncTask(Context context,CoachDetails coachDetails) {
        this.coachDetails=coachDetails;
        this.context=context;
        }

        @Override
        protected String doInBackground(String... params) {
            coachDetails.save();
         return null;
        }

        @Override
        protected void onPostExecute(String s) {


     //                    CoachDetails details = SQLite.select()
 //                            .from(CoachDetails.class)
//                            .querySingle();

 //                    Log.d(TAG, "CId from db:\t" + details.getCoachId() + " first_name:\t" + details.getFirstName()); // name is null and id is showing properly

 //                    startActivity(new Intent(LoginActivity.this, MainActivity.class));

        }
    }

Примечание. Для вставки строки в базу данных потребуется время. Вы получаете доступ к нему без ожидания.

После этого ваши данные не отображаются, значит, ваша база данных пуста. Следуйте этому учебнику и изучите DBFlow.

person sushildlh    schedule 18.12.2018
comment
Я вызвал coachDetails.save() с полями, установленными из ответа. Где ты делал свою? - person Darth Plagueris; 18.12.2018
comment
проверить внутри onResponse of Call - person Darth Plagueris; 18.12.2018
comment
Спасибо, я исправил это. Проверьте мой ответ, это был недосмотр с моей стороны - person Darth Plagueris; 18.12.2018