我刚开始查看房间,安装并遇到了一个bug。
该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();}
Build.gradle
implementation 'android.arch.persistence.room:runtime:2.2.5'
annotationProcessor 'android.arch.persistence.room:compiler:2.2.5'图像误差错误
发布于 2020-04-01 09:05:01
将Note类中的变量“Integer id”改为“int id”,并将Appdatabase类中的“迁移(1,0)”改为“迁移(0,1)”。
发布于 2020-08-20 21:41:42
我今天有一个类似的问题,解决方案可能隐藏得特别好,这取决于您如何构建实体。
对我来说,这种情况之所以出现,是因为一开始我就用一个原始id来修饰Entidy,但后来由于泛型的一些困难,我决定将主键字段从一个长变量改为一个长变量。
Java将需要从长到长的转换,因为它们的后代,所以保留在long中的getter和构造函数没有给我任何错误,我完全忘记了这一点。
几天后,当DB被计算出来时,Room开始给我一个长不能检查为null的问题,而自动生成的代码在字段是私有的情况下获得公共方法(Ofc)。
简单的解决方案是将@NonNull注释放在字段上,Room停止检查它的空能力。
问题是,即使您的@PrimaryKey设置了@NonNull注释,Room仍然遵循getter和构造函数的说法,他们说字段是长的,而不是长的。
因此,这个注释需要放在任何地方,这意味着构造函数和getter。因此,一切都需要从长更改为长/从原始对象更改为对象,当实体足够大时,...an很容易丢失,并且更改完成后几天就会出现问题。
@PrimaryKey
@ColumnInfo(name = "id")
@NonNull
private Long id;
public Constructor(
@NonNull Long id
) {
this.id = id;
}
@NonNull
public Long getId() {
return id;
}https://stackoverflow.com/questions/60967121
复制相似问题