Room IllegalArgumentException:intcannot be converted to an Element

Room IllegalArgumentException: intcannot be converted to an Element

我在尝试编译项目时遇到此错误:

Error:Execution failed for task ':app:compileDebugJavaWithJavac'. java.lang.IllegalArgumentException: intcannot be converted to an Element

还有这个警告:

Warning:Supported source version 'RELEASE_7' from annotation processor 'android.arch.persistence.room.RoomProcessor' less than -source '1.8'

这些是我的数据库相关 类:

@Entity(tableName = "users")
public class SerializedUser {

    @PrimaryKey(autoGenerate = true)
    private int id;

    @ColumnInfo(name = "first_name")
    private String firstName;

    @ColumnInfo(name = "last_name")
    private String lastName;

    @ColumnInfo(name = "username")
    private String username;

    public SerializedUser(int id, String firstName, String lastName, String username) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.username = username;
    }

    public int getId() {
        return id;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public String getUsername() {
        return username;
    }
}

@android.arch.persistence.room.Database(entities = {SerializedUser.class}, version = 4)
public abstract class Database extends RoomDatabase {
    public abstract UserDao userDao();

    private static final String DATABASE_NAME = "weather";

    // For Singleton instantiation
    private static final Object LOCK = new Object();
    private static volatile Database i;

    public static Database init(Context context) {
        if (i == null) {
            synchronized (LOCK) {
                if (i == null) {
                    i = Room.databaseBuilder(context.getApplicationContext(),
                            Database.class, Database.DATABASE_NAME)
                            .fallbackToDestructiveMigration().build();
                }
            }
        }
        return i;
    }

    public static boolean isInited(){
        return i != null;
    }

    public static Database getInstance(){
        if(i == null)
            throw new NullPointerException("Database.getInstance called when Database not initialized");
        return i;
    }
}

@Dao
public abstract class UserDao {

    Converters converters;

    public void inject(Converters converters) {
        this.converters = converters;
    }

    @Insert(onConflict = REPLACE)
    public abstract void saveNow(SerializedUser user);

    @Delete
    public abstract void deleteNow(int id);

    @Query("DELETE FROM users")
    public abstract void deleteAllNow();

    @Query("SELECT * FROM users")
    public abstract List<SerializedUser> getAllNow();

    @Query("SELECT * FROM users ORDER BY last_name ASC")
    public abstract LivePagedListProvider<Integer, SerializedUser> usersByLastName();
}

所以当它试图实现数据库时会发生错误类? SerializedUser 上的那个 id 不是问题,我已经把它注释掉了,问题还是一样。尝试清理并重建项目并重新启动 Android Studio(无效并重新启动)。

删除

@Delete
public abstract void deleteNow(int id);

在你的 Dao 中它会起作用

@Delete annotation marks a method in a Dao annotated class as a delete method. The implementation of the method will delete its parameters from the database.
All of the parameters of the Delete method must either be classes annotated with Entity or collections/array of it.

阅读 here 了解更多信息。

因此,在您的情况下,您传递了一个 int 类型的参数,这违反了上述规则。这就是您收到该错误的原因。

为了解决这个问题,您应该排除 deleteNow 方法或者只传递任何不违反上述规则的参数。

Error:Execution failed for task ':app:compileDebugJavaWithJavac'. java.lang.IllegalArgumentException: intcannot be converted to an Element

基本上,这个问题不仅是由 @Delete 查询引起的,而且是由房间的所有 CRUD 注释(@Insert@Delete@Update)引起的,除了 @Query.

这些 CRUD 注释方法的所有参数必须是 类 注释实体或 collections/array 实体。

所以我们不能传递 primitive 或其他的。