Как заставить метод вставки базы данных Room возвращать int через архитектуру mvvm? - PullRequest
0 голосов
/ 09 июля 2019

Я хочу, чтобы идентификатор автоматически генерировался при выполнении операции вставки в базу данных Room. Я реализую архитектуру MVVM (Model-View-ViewModel), которая использует DAO для запуска запросов к базе данных Room. Я добавил слой репозитория между viewmodel и DAO, чтобы создать AsyncTask для выполнения операций с базой данных. Как получить выходные данные операции вставки (которая является автоматически сгенерированным идентификатором вставленной строки) для фрагмента, который использует модель представления. Слои следующие: Фрагмент -> ViewModel -> Хранилище -> DAO

ListFragment.java

public class ListFragment extends Fragment {
    private ReminderViewModel viewModel;
    private int id;
    ...
        viewModel = ViewModelProviders.of(this).get(ReminderViewModel.class);
    ...
        id = viewModel.insert(new TodoReminder(0, description, date, time));
    ...
}

ReminderViewModel.java

public class ReminderViewModel extends AndroidViewModel {
    private ReminderRepository repository;

    public ReminderViewModel(@NonNull Application application) {
        super(application);
        repository = new ReminderRepository(application);
    }

    public int insert(TodoReminder reminder) {
        repository.insert(reminder);
    }
}

ReminderRepository.java

public class ReminderRepository {
    private ReminderDAO reminderDAO;

    public ReminderRepository(Application application) {
        AppDatabase db = AppDatabase.getDatabase(application);
        reminderDAO = db.getReminderDAO();
    }

    public int insert(TodoReminder reminder) {
        new insertAsyncTask(reminderDAO).execute(reminder);
    }

    private static class InsertAsyncTask extends AsyncTask<TodoReminder, Void, Integer> {
        private ReminderDAO asyncTaskDAO;

        insertAsyncTask(ReminderDAO dao) {
            asyncTaskDAO = dao;
        }

        @Override
        protected Integer doInBackground(final TodoReminder... reminders) {
            return asyncTaskDAO.insert(reminders[0]);
        }
    }
}

ReminderDAO.java

@Dao
public interface ReminderDAO {
    @Insert
    public int insert(TodoReminder... reminders);
}

ToDoReminder.java

public class TodoReminder implements Serializable {
    @PrimaryKey(autoGenerate = true)
    @NonNull
    private int id;
    ...
}

Как получить int, возвращенный из метода вставки ReminderDAO, и вернуть его из метода вставки в ReminderRepository?

1 Ответ

0 голосов
/ 09 июля 2019

Вы можете создать свою таблицу database таким образом, чтобы id автоматически увеличивался.В MySQL это делается с помощью ключевого слова auto_increment.В SQL Server это делается с помощью синтаксиса identity(1, 1).В Access это ключевое слово autoincrement.В Oracle и PostgreSQL это делается с использованием sequence s.Если вам удастся сделать это, вам не нужно будет вручную работать над увеличением этих значений.Если по какой-то причине об этом не может быть и речи, вы можете создать триггер before insert, который будет загружать максимальный идентификатор и добавлять к нему 1, сохраняя результат в идентификаторе.Или, если даже об этом не может быть и речи, вы можете загрузить последний идентификатор, но он имеет другой синтаксис в разных базах данных.Или вы можете выполнить запрос, подобный следующему:

select max(id) + 1 from yourtable;

, но остерегайтесь возможных проблем с производительностью и проблем параллелизма.

...