【问题标题】:Room - error incomparable types: int and <null>Room - 错误无法比拟的类型:int 和 <null>
【发布时间】:2020-04-01 08:58:53
【问题描述】:

我刚开始查看房间,安装并遇到错误。

bug如下:

..\todolist\DAO\NoteDao_Impl.java: 42: 错误:无法比较的类型:int 和 if (value.getId () == null) {

据我所知,是因为主键是int,所以这个类有错误(这个类是有房的,不是我创建的)。 我不知道如何解决它,请帮助我。

一些类信息

Note.java

@Entity(tableName = "Note")
public class Note {
    @PrimaryKey(autoGenerate = true)
    private Integer id;
    private String content;
    private int color;
    private boolean isChecked;
    private String nameSublist;
    @Ignore
    private Date createAt;

    public Note() {
    }

    public Note(int id, String content) {
        this.id = id;
        this.content = content;
        this.color = 0;
    }
    // getter and setter
}

NoteDao.java

@Dao
public abstract class NoteDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    public abstract Long insertNote(Note note);

    @Update(onConflict = OnConflictStrategy.REPLACE)
    public abstract void updateNote(Note note);

    @Delete
    public abstract void deleteNote(Note note);

    @Query("DELETE FROM " + Constants.KEY_TABLE_NAME_NOTE)
    public abstract void deleteAll();

    @Query("DELETE FROM Note WHERE nameSublist= :sublist")
    public abstract void deleteSublist(String sublist);

    @Query("SELECT * FROM Note")
    public abstract List<Note> queryAll();

    @Query("SELECT * FROM Note  WHERE nameSublist = :sublist")
    public abstract List<Note> querySublist(String sublist);

    @Query("SELECT * FROM Note WHERE id = :id")
    public abstract Note queryNote(int id);
}

Appdatabase.java

@Database(entities = {Note.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
    private static final Migration MIGRATION_1_0 = new Migration(1, 0) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            // do something when update version
        }
    };
    private static AppDatabase INSTANCE;

    public static AppDatabase getInstance(Context context) {
        if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context, AppDatabase.class, Constants.KEY_TABLE_NAME_APPDATA) //todolist.sqlite
                    .allowMainThreadQueries()   // allow query in main, default false
                    .addMigrations(MIGRATION_1_0)
                    .fallbackToDestructiveMigration()
                    .build();
        }
        return INSTANCE;
    }

    public abstract NoteDao noteDao();

}

构建.gradle

implementation 'android.arch.persistence.room:runtime:2.2.5'
annotationProcessor 'android.arch.persistence.room:compiler:2.2.5'

图像错误 bug

【问题讨论】:

    标签: java android android-room


    【解决方案1】:

    我认为在 Note 类中将变量 'Integer id' 更改为 'int id' 并将 Appdatabase 类中的 'Migrate(1, 0)' 更改为 'Migrate(0, 1)'

    【讨论】:

    • 感谢您的评论。我尝试将 Migrate (1, 0) 更改为 Migrate (0, 1) 但我仍然没有修复错误
    • @Zeroes 你在 Note 类中将变量 Integer id 更改为 int id 吗?
    • 对不起兄弟。原来是int,看到null错误后,我改成了Integer。如果是这种情况,问题是将 Migrate (1, 0) 更改为 Migrate (0, 1)。将 Integer 更改为 int 后,错误已修复。谢谢兄弟
    • 我们能成为朋友吗?我住在岘港
    【解决方案2】:

    我今天遇到了类似的问题,解决方案可能隐藏得特别好,具体取决于您构建实体的方式。

    对我来说,出现这种情况是因为一开始我用原始 id 构造了 Entidy,但后来由于泛型的一些困难,我决定将主键字段从长变量更改为长变量。

    Java 知道由于它们的后代需要从 Long 到 long 的转换,所以保持为 long 的 getter 和构造函数没有给我任何错误,我完全忘记了这一点。

    几天后,当数据库被弄清楚时,Room 开始给我一个 long 不能被检查为 null 的问题,并且碰巧自动生成的代码,如果字段是私有的,则获取公共方法(ofc )。

    简单的解决方案是将@NonNull 注释放在字段上,Room 将停止检查其是否为空。

    问题在于,即使您的 @PrimaryKey 设置了 @NonNull 注释,Room 仍然遵守 getter 和构造函数所说的内容,并且他们说该字段是长字段,而不是长字段。

    所以这个注释需要被放置在任何地方,这意味着构造函数和getter,..所以一切都需要从long更改为Long/从原始到对象,......当你的实体足够大时很容易错过并且问题是在进行更改后几天出现的。

    @PrimaryKey
    @ColumnInfo(name = "id")
    @NonNull
    private Long id;
    
    public Constructor(
            @NonNull Long id
    ) {
        this.id = id;
    }
    
    @NonNull
    public Long getId() {
        return id;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 2023-03-15
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多