SQLite MVVM возвращает и получает rowId в Activity - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть приложение, созданное с использованием MVVM. У меня есть приложение успешно делает вставки в базу данных SQLite. Теперь я пытаюсь получить rowId в БД после выполнения вставки, чтобы при последующих действиях в эту строку можно было вносить обновления.

Я полностью понимаю ту часть, где мы меняем значение Void на Long в DAO, но я понятия не имею, как на самом деле получить доступ к этому длинному на уровне активности и сохранить его в переменную, которую можно отправить из действия в действие с помощью Intent.PUTEXTRA. Примеры кода ниже.

Класс таблицы / сущности:

@Entity(tableName = "CbtTable")
public class CbtTable {

@PrimaryKey(autoGenerate = true)
private long cbtId;

Класс репозитория:

public class CbtRepository {

private CbtDao cbtDao;
private LiveData<List<CbtTable>> cbtData;
private FeelingFitDatabase mFeelingFitDatabase;

public CbtRepository(Application application) {
    mFeelingFitDatabase = FeelingFitDatabase.getInstance(application);
    cbtDao = mFeelingFitDatabase.getCbtDao();
    cbtData = cbtDao.getCbtData();
}


public void insertCbt(CbtTable cbtTable){

    new InsertCbtAsyncTask(cbtDao).execute(cbtTable);

}

DAO

@Dao
public interface CbtDao {

@Insert(onConflict = REPLACE)
public long insertAutoThought(CbtTable cbtTable);

@Query("UPDATE CbtTable SET automaticThought = :automaticThought WHERE cbtId = :cbtId")
void updateAutoThought(long cbtId, String automaticThought);

@Query ("UPDATE CbtTable SET twistedThinking = :twistedThinking WHERE cbtId = :cbtId")
void updateTwistedThinking(long cbtId, int twistedThinking);

Класс ViewModel:

public class CbtViewModel extends AndroidViewModel {

private CbtRepository cbtRepository;
private LiveData<List<CbtTable>> cbtData;

public CbtViewModel(@NonNull Application application) {
    super(application);
    cbtRepository = new CbtRepository(application);
    cbtData = cbtRepository.getCbtData();
}

public void insert(CbtTable cbtTable){
    cbtRepository.insertCbt(cbtTable);
}

public void updateTwistedThinking(CbtTable cbtTable){
    cbtRepository.updateTwistedThinking(cbtTable);
}

Asyn c Класс задачи:

public class InsertCbtAsyncTask extends AsyncTask<CbtTable, Void, Void> {

private CbtDao mCbtDao;

public InsertCbtAsyncTask(CbtDao cbtDao){
    mCbtDao = cbtDao;
}


@Override
protected Void doInBackground(CbtTable... cbtTables) {
    mCbtDao.insertAutoThought(cbtTables[0]);
    return null;
}

Метод действия:

 private void saveAutomaticThought(){

    CbtTable cbtTable = new CbtTable(userId, automaticThoughtString, twistedThinking, challengeThoughtString, rationalThoughtString, postedWorkout);
    cbtViewModel.insert(cbtTable);
    long cbtId = cbtTable.getCbtId();

    // Sends the user to the WorkoutAutomaticThoughtActivity page
    Intent intent = new Intent(this, WorkoutTwistedThinkingActivity.class);
    intent.putExtra("cbtId", cbtId);

С указанным выше кодом в Activity cbtId хранится как 0, поэтому он не работает. Это бесплатное приложение для психического здоровья, которое я разрабатываю, чтобы попытаться помочь людям, поэтому, чем скорее я смогу решить эту проблему, тем скорее я смогу запустить приложение. Я был бы очень признателен за любую помощь для устранения этой проблемы и заставить его работать.

1 Ответ

0 голосов
/ 04 февраля 2020

Я не рекомендую вам использовать AsynTask. Но вы можете сделать что-то вроде этого.

Сделайте так, чтобы ваш InsertCbtAsyncTask принимал обратный вызов в качестве параметра и вызывал его после того, как у него есть вставленный идентификатор:

public class InsertCbtAsyncTask extends AsyncTask<CbtTable, Void, Void> {
    private CbtDao mCbtDao;
    private long id;
    private DoWithId callback;

    public InsertCbtAsyncTask(CbtDao cbtDao, DoWithId callback){
        mCbtDao = cbtDao;
        this.callback = callback;
    }

    @Override
    protected Void doInBackground(CbtTable... cbtTables) {
        id = mCbtDao.insertAutoThought(cbtTables[0]);
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        callback.doWithId(id);
    }

    interface DoWithId {
        public void doWithId(long id);
    }

}

Затем при вызове этого класса вы можете передать обратный вызов в качестве параметра. Например:

    DoWithId callback = new DoWithId() {
        @Override
        public void doWithId(long id) {
            launchIntentWithId(id)
        }
    };
    new InsertCbtAsyncTask(cbtDao, callback).execute(cbtTable);

launchIntentWithId() будет выглядеть так:

public launchIntentWithId(long cbtId) {
    Intent intent = new Intent(this, WorkoutTwistedThinkingActivity.class);
    intent.putExtra("cbtId", cbtId);
    startActivity(Intent);
}

Этот код не проверен и может быть неполным, но он должен дать вам полное представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...