当前位置: 首页 > 知识库问答 >
问题:

在房间持久性库Android Studio中插入后获得RowID

史英飙
2023-03-14

我一直在使用codelabs实现我的房间数据库持久化。现在,在将数据插入房间数据库后,我正在尝试获取最新的rowID。但是,我被困在存储库中,试图从异步任务返回rowID。

LogEntity.java

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

洛格道。JAVA

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

日志数据库。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;
    }
}

日志存储库。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]);
        }
    }

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

LogViewModel。JAVA

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

主要活动。JAVA

        long id = logViewModel.insertLog(logEntity);

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

共有1个答案

云项禹
2023-03-14

你在正确的轨道上,但并不完全正确。您应该将AsyncTask类声明为ViewModel的内部类,而不是DB。

在ViewModel中添加一个ID变量,在AsyncWG中添加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;
    }
}
 类似资料:
  • Android的Room持久性库优雅地包含了适用于对象或集合的@Insert和@Update注释。但是,我有一个用例(包含模型的推送通知),它需要UPSERT,因为数据库中可能存在数据,也可能不存在数据。 Sqlite本机不具有up,在这个SO问题中描述了解决方法。鉴于那里的解决方案,如何将它们应用于Room? 更具体地说,如何在房间中实现插入或更新,而不破坏任何外键约束?使用insert wit

  • 转换器.KT FoodDatabase.kt 当我运行以下代码创建数据库时: 我还附上我的评分文件: 有人遇到过这个问题吗?

  • 我所要做的就是从insert中获取作为long的返回值。我得到了,但它不起作用,我从返回的值中返回0。我正在使用一个、存储库和,如谷歌代码实验室中所述。在房间里插入后,我一直关注这篇文章。 球员级别 道 存储库 视图模型 活动

  • 最近几天,我一直在学习新的Android架构组件。跟进一些博文后,留档

  • 我刚刚使用Android room persistence library,通常我使用DBHeper来管理数据,但我正在尝试使用这项技术,我想知道如何在room persistence library中使用这个查询 但是,当我在“喜欢”之后使用%时,我会在红线上划下它

  • 如何使用房间持久性库删除特定表上的所有条目?我需要删除表,但我找不到任何信息如何做到这一点。 仅当数据库正在迁移或加载所有条目并删除它们时:)