【问题标题】:Unable to create entry inside table in Room database无法在 Room 数据库中的表内创建条目
【发布时间】:2020-05-10 09:41:43
【问题描述】:

我在房间数据库中创建了两个@Entity(tables)。第一个任务(Task.class)和第二个统计(TaskStat.class)。我想从第一类(Task.class)的第二个表中自动创建条目。为了在第二个表中插入条目,我在TaskDao.class 接口中创建了一个@Dao 方法。这是我的java代码:

任务.class

public class Task {
    @PrimaryKey
    @ColumnInfo(name = "task_ID")
    private Long taskId;

    @ColumnInfo(name = "creator_ID")
    private Long creatorId;
    private String title;
    private String description;

    @Ignore
    private TaskDao taskDao;

    public Task(String title){
        this.taskId = IdGenerator.generate();
        this.title = title;
        TaskStat taskStat = new TaskStat(getTaskId());
        taskDao.insertStat(taskStat);
    }

    public Long getTaskId() {
        return taskId;
    }

TaskStat.class

@Entity(tableName = "task_statistic",
        foreignKeys = @ForeignKey(entity = Task.class, parentColumns = "task_ID",
                                    childColumns = "ownerId", onDelete = ForeignKey.CASCADE))
public class TaskStat {
    @PrimaryKey(autoGenerate = true)
    private int id;

    private long ownerId;
    private boolean completed;

    TaskStat(long ownerId) {
        this.ownerId = ownerId;
        this.completed = false;
    }

    public int getId() {
        return id;
    }
    public long getOwnerId() {
        return ownerId;
    }
    public boolean isCompleted() {
        return completed;
    }

    public void setId(int id) {
        this.id = id;
    }
    public void setCompleted(boolean completed) {
        this.completed = completed;
    }
}

TaskDao.class

@Dao
public interface TaskDao {
    @Insert
    void insert(Task task);

    @Insert
    void insertStat(TaskStat taskStat);

正如您在Task.class 中看到的那样,我希望每当我创建Task.class 的对象时,它会自动创建TaskStats.class 的对象,然后将其插入taskStat 表中。这两个表都是在数据库中创建的,但在第二个表(task_statistic)中没有条目。 它正在抛出NullPointException。问题出在哪里?

编辑:

我使用过的依赖项:

dependencies {
    def lifecycle_version = "2.2.0"
    def room_version = "2.2.5"
    /*ViewModel and LiveData (New Style-in one Line)*/
    implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
    annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
    /*Room Dependencies*/
    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"
}

【问题讨论】:

    标签: java android-studio android-sqlite android-room


    【解决方案1】:

    首先你不应该在实体类构造函数中传递DAO。这不是一个好的设计实践,这样做会增加代码的耦合度。

    此外,通过使用 in 构造函数级别并这样做将无法正确维护实体的生命周期。我建议您将 TaskStat 类作为 Task 实体中的一个属性,并将级联类型设置为持久化,这样框架会在您持久化 Task 实体时自动持久化它。

    public class Task {
       @PrimaryKey
       @ColumnInfo(name = "task_ID")
       private Long taskId;
    
       @ColumnInfo(name = "creator_ID")
       private Long creatorId;
       private String title;
       private String description;
    
    
       @OneToOne(cascade= CascadeType.PERSIST)
       private TaskStat taskStat;
    
       //getters , setters 
    
    }
    

    【讨论】:

    • 你在这个应用程序中使用了哪些库
    猜你喜欢
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多