gpt4 book ai didi

java - 如何通过mvvm架构让Room数据库insert方法返回int?

转载 作者:行者123 更新时间:2023-12-02 03:17:43 24 4
gpt4 key购买 nike

我想在 Room 数据库上执行插入操作时自动生成 id。我正在实现 MVVM(模型- View - View 模型)架构,它利用 DAO 来向 Room 数据库发起查询。我在 viewmodel 和 DAO 之间添加了一个存储库层,以创建 AsyncTask 来执行数据库操作。如何将插入操作的输出(即插入行的自动生成的 id)获取到使用 View 模型的 fragment 。各层如下:Fragment -> ViewModel -> Repository -> 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;
...
}

如何获取 ReminderDAO 的 insert 方法返回的 int 并从 ReminderRepository 的 insert 方法返回它?

最佳答案

您可以通过id 自动递增的方式创建数据库 表。在 MySQL 中,这是通过 auto_increment 关键字完成的。在 SQL Server 中,它是通过 identity(1, 1) 语法完成的。在 Access 中,它是 autoincrement 关键字。在 Oracle 和 PostgreSQL 中,它是使用序列完成的。如果您设法做到这一点,那么您将不需要手动增加这些值。如果由于某种原因这是不可能的,那么您可以创建一个 before insert 触发器,它将加载最大 id 并为其加 1,并将结果存储在 id 中。或者,如果这也是不可能的,那么您可以加载最后一个 ID,但它在不同的数据库中具有不同的语法。或者,您可以运行如下查询:

select max(id) + 1 from yourtable;

但要注意可能的性能问题和并发问题。

关于java - 如何通过mvvm架构让Room数据库insert方法返回int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56950531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com