在下面的代码中,我得到rowId
。我读到,也可以直接从@插入
获取最后插入的行id。在我的代码中,我把空插入改为长,并尝试了许多其他的东西,就像我在互联网上找到的例子一样,但是每次我都会出错。你想给我提供一个代码/解决方案,从@插入获取行/用户ID吗?
@Dao
public interface UserDao {
@Insert
void insert(UserEntity userEntity);
@Update
void update(UserEntity userEntity);
@Delete
void delete(UserEntity userEntity);
@Query("DELETE FROM user_table")
void deleteAllUsers();
@Query("SELECT * FROM user_table")
LiveData<List<UserEntity>> getAllUsers();
// ====== from here ======
@Query("SELECT * FROM user_table")
LiveData<UserEntity> getRowId();
// ====== till here ======
}
实体
@Entity(tableName = "user_table")
public class UserEntity {
@PrimaryKey(autoGenerate = true)
private int id;
private String userName;
private String userTelephoneNumber;
public UserEntity(String userName, String userTelephoneNumber) {
this.userName = userName;
this.userTelephoneNumber = userTelephoneNumber;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public String getUserName() {
return userName;
}
public String getUserTelephoneNumber() {
return userTelephoneNumber;
}
}
存储库
public class UserRepository {
private UserDao userDao;
private LiveData<List<UserEntity>> allUsers;
public UserRepository(Application application) {
HandymanDatabase handymanDatabase = HandymanDatabase.getInstance(application);
userDao = handymanDatabase.userDao();
allUsers = userDao.getAllUsers();
}
public void insert(UserEntity userEntity) {
new InsertUserAsyncTask(userDao).execute(userEntity);
}
public void update(UserEntity userEntity) {
new UpdateUserAsyncTask(userDao).execute(userEntity);
}
public void delete(UserEntity userEntity) {
new DeleteUserAsyncTask(userDao).execute(userEntity);
}
public void deleteAllUsers() {
new DeleteAllUsersAsyncTask(userDao).execute();
}
public LiveData<List<UserEntity>> getAllUsers() {
return allUsers;
}
// ====== from here ======
public LiveData<UserEntity> getRowId() {
return userDao.getRowId();
}
// ====== till here ======
private static class InsertUserAsyncTask extends AsyncTask<UserEntity, Void, Void> {
private UserDao userDao;
private InsertUserAsyncTask(UserDao userDao) {
this.userDao = userDao;
}
@Override
protected Void doInBackground(UserEntity... userEntities) {
userDao.insert(userEntities[0]);
return null;
}
}
private static class UpdateUserAsyncTask extends AsyncTask<UserEntity, Void, Void> {
private UserDao userDao;
private UpdateUserAsyncTask(UserDao userDao) {
this.userDao = userDao;
}
@Override
protected Void doInBackground(UserEntity... userEntities) {
userDao.update(userEntities[0]);
return null;
}
}
private static class DeleteUserAsyncTask extends AsyncTask<UserEntity, Void, Void> {
private UserDao userDao;
private DeleteUserAsyncTask(UserDao userDao) {
this.userDao = userDao;
}
@Override
protected Void doInBackground(UserEntity... userEntities) {
userDao.delete(userEntities[0]);
return null;
}
}
private static class DeleteAllUsersAsyncTask extends AsyncTask<Void, Void, Void> {
private UserDao userDao;
private DeleteAllUsersAsyncTask(UserDao userDao) {
this.userDao = userDao;
}
@Override
protected Void doInBackground(Void... voids) {
userDao.deleteAllUsers();
return null;
}
}
}
查看模型
public UserViewModel(@NonNull Application application) {
super(application);
userRepository = new UserRepository(application);
allUsers = userRepository.getAllUsers();
}
public void insert(UserEntity userEntity) {
userRepository.insert(userEntity);
}
public void update(UserEntity userEntity) {
userRepository.update(userEntity);
}
public void delete(UserEntity userEntity) {
userRepository.delete(userEntity);
}
public void deleteAllUsers() {
userRepository.deleteAllUsers();
}
public LiveData<List<UserEntity>> getAllUsers() {
return allUsers;
}
// ====== from here ======
public LiveData<UserEntity> getRowId() {
return userRepository.getRowId();
}
// ====== till here ======
}
片段/活动
public class UserFavoritesFragment extends Fragment {
private static final String TAG = "UserFavoritesFragment";
private UserViewModel userViewModel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = getLayoutInflater().inflate(R.layout.fragment_user_favorites, container, false);
final TextView textViewUserName = view.findViewById(R.id.textViewUserName);
TextView textViewUserPhone = view.findViewById(R.id.textViewUserPhone);
userViewModel = new ViewModelProvider(this).get(UserViewModel.class);
// ====== from here ======
userViewModel.getRowId().observe(getViewLifecycleOwner(), new Observer<UserEntity>() {
@Override
public void onChanged(UserEntity userEntity) {
long rowId = userEntity.getId();
Log.d(TAG, "onChanged: " + rowId);
}
});
// ====== till here ======
return view;
}
}
可以使用具有接受数据库中插入的行ID的长值的回调的侦听器接口来执行此操作。
监听器接口
public interface NewIdListener {
void onInsert(long id);
}
刀
@Dao
public interface UserDao {
@Insert
long insert(UserEntity userEntity); // return id of the inserted userEntity
}
存储库
public class UserRepository {
private Executor mExecutor = Executors.newSingleThreadExecutor();
private UserDao userDao;
...
public void insertUserEntity(final UserEntity entity, final NewIdListener listener) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
listener.onInsert(userDao.insert(entity));
}
});
}
查看模型
public void insertUserEntity(UserEntity entity, NewIdListener listener) {
userRepository.insertUserEntity(entity, listener);
}
活动
userViewModel.insertUserEntity(new UserEntity("User Name", "12345678"), new NewIdListener() {
@Override
public void onInsert(final long id) {
requireActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(requireActivity(), "Id: " + id, Toast.LENGTH_SHORT).show();
}
});
}
});
注意:对于后台线程,我使用了Executor
而不是AsyncTask
,因为AsyncTask
现在已被弃用。
保存课程()应该启动验证导师()来创建和/或验证导师的当前输入信息是否可以添加到课程实体构造器中。mMentorViewModel.save导师(mMentor)应该通过Schuldler存储库,而Schuludler存储库使用数据库中的MentorDAO来插入新的导师。 我读过这个方法Android Room-使用auto generate获取新插入行的id,但是我缺少一些关于如何获取新创建的m
这是我的密码: 如您所知,它会在数据库中插入一个新行。现在我需要获取插入行的。我怎么能得到这个? 注意,我知道,如果我使用
问题内容: 我有一个查询要在表中插入一行,该表有一个名为ID的字段,该字段在列上使用AUTO_INCREMENT填充。我需要为下一个功能获取此值,但是当我运行以下命令时,即使实际值不为0,它也总是返回0: 根据我的理解,这应该返回ID列,但每次仅返回0。有任何想法吗? 编辑: 当我跑步时: 我得到: 问题答案: [编辑:在引用last_insert_id()之前添加了“选择”] 插入后运行“ ”怎
问题内容: 我正在使用PHP中的mvc结构,我想检索最后插入的行ID。 我创建了以下sql代码: 但不幸的是我遇到了这个错误: 我也尝试过此堆栈链接,但不适用于我,因此如果您能帮助我获取ID,我将非常高兴。 我也在这里共享我的controller.php文件。 问题答案: 你快到了。 如果您查看lastInsertId的手册页,则会在数据库句柄上调用它- 您当前正在语句中对其进行调用。 您只需要致
不管怎样,感谢所有人的回答。
问题内容: 我正在掌握PDO的基础知识。 但是我试图获取插入的行的ID,我使用: 我遇到的教程都是关于交易的,但是我没有使用交易! 问题答案: 您可能正在寻找lastInsertId。“返回最后插入的行或序列值的ID”。