首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >房间错误不可比较类型: int和<null>

房间错误不可比较类型: int和<null>
EN

Stack Overflow用户
提问于 2020-04-01 08:58:53
回答 2查看 674关注 0票数 2

我刚开始查看房间,安装并遇到了一个bug。

该bug如下:

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

据我所知,这是因为主键是int,所以这个类有一个错误(这个类是空间的,而不是我创建的)。我不知道怎么修,请帮帮我。

某些类信息

Note.java

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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

代码语言:javascript
复制
implementation 'android.arch.persistence.room:runtime:2.2.5'
annotationProcessor 'android.arch.persistence.room:compiler:2.2.5'

图像误差错误

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-01 09:05:01

将Note类中的变量“Integer id”改为“int id”,并将Appdatabase类中的“迁移(1,0)”改为“迁移(0,1)”。

票数 3
EN

Stack Overflow用户

发布于 2020-08-20 21:41:42

我今天有一个类似的问题,解决方案可能隐藏得特别好,这取决于您如何构建实体。

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

Java将需要从长到长的转换,因为它们的后代,所以保留在long中的getter和构造函数没有给我任何错误,我完全忘记了这一点。

几天后,当DB被计算出来时,Room开始给我一个长不能检查为null的问题,而自动生成的代码在字段是私有的情况下获得公共方法(Ofc)。

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

问题是,即使您的@PrimaryKey设置了@NonNull注释,Room仍然遵循getter和构造函数的说法,他们说字段是长的,而不是长的。

因此,这个注释需要放在任何地方,这意味着构造函数和getter。因此,一切都需要从长更改为长/从原始对象更改为对象,当实体足够大时,...an很容易丢失,并且更改完成后几天就会出现问题。

代码语言:javascript
复制
@PrimaryKey
@ColumnInfo(name = "id")
@NonNull
private Long id;

public Constructor(
        @NonNull Long id
) {
    this.id = id;
}

@NonNull
public Long getId() {
    return id;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60967121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档