gpt4 book ai didi

java - 插入 Room Persistence Library Android Studio 后获取 RowID

转载 作者:行者123 更新时间:2023-12-02 05:05:30 26 4
gpt4 key购买 nike

我一直在使用codelabs用于我的房间数据库持久性。现在我试图在将数据插入我的房间数据库后获取最新的 rowID 。但是,我被困在存储库中试图从 AsyncTask 返回 rowID。

LogEntity.java

@Entity
public class LogEntity {
@PrimaryKey(autoGenerate = true)
private int id;

LogDao.java

public interface LogDao {
@Insert
long insert(LogEntity logEntity);

LogDatabase.java

@Database(entities = LogEntity.class, version = 1)
public abstract class LogDatabase extends RoomDatabase {

private static LogDatabase instance;
public abstract LogDao logDao();

public static synchronized LogDatabase getInstance(Context context){
if (instance == null){
instance = Room.databaseBuilder(context.getApplicationContext(),
LogDatabase.class, "log_database").
fallbackToDestructiveMigration().build();
}
return instance;
}
}

LogRepository.java

    public long insertLogs(LogEntity logEntity) {
new InsertLogAsyncTask(logDao).execute(logEntity);
return **
}
private static class InsertLogAsyncTask extends AsyncTask<LogEntity, Void, Long>{
private LogDao logDao;
private InsertLogAsyncTask(LogDao logDao){
this.logDao = logDao;
}
@Override
protected Long doInBackground(LogEntity... logEntities) {
logDao.insert(logEntities[0]);
return logDao.insert(logEntities[0]);
}
}

我放了两个星号,因为我不确定在这里要做什么才能获取插入 RowID 以及我的 AsyncTask 是否完全正确。

LogViewModel.java

    public long insertLog(LogEntity logEntity){
return repository.insertLogs(logEntity);
}

MainActivity.java

        long id = logViewModel.insertLog(logEntity);

我希望能够使用这个最终的 id 变量以供将来使用。

最佳答案

您的方向是正确的,但还没有完全到位。您应该将 AsyncTask 类声明为 ViewModel 的内部类,而不是 DB 的内部类。

在 ViewModel 中添加 ID 变量,并在 AsyncTask 中添加 onPostExecute 重写来处理执行结果。

LogViewModel.java

long mLastInsertedID;

private static class InsertLogAsyncTask extends AsyncTask<LogEntity, Void, Long>{
private LogDao logDao;
private InsertLogAsyncTask(LogDao logDao){
this.logDao = logDao;
}
@Override
protected Long doInBackground(LogEntity... logEntities) {
//you are now off the UI thread
logDao.insert(logEntities[0]);
return logDao.insert(logEntities[0]);
}

@Override
protected void onPostExecute(Long result) {
//Do whatever you like with the result as you are back on the UI thread
mLastInsertedID = result;
}
}

关于java - 插入 Room Persistence Library Android Studio 后获取 RowID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56354433/

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