Room IllegalArgumentException:int不能转换为Element

时间:2017-11-05 22:43:12

标签: java android android-room

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

  

错误:任务':app:compileDebugJavaWithJavac'执行失败。   java.lang.IllegalArgumentException:int不能转换为Element

这个警告:

  

警告:支持的源版本' RELEASE_7'来自注释处理器' android.arch.persistence.room.RoomProcessor'少于-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(无效并重新启动)。

3 个答案:

答案 0 :(得分:7)

删除

@Delete
public abstract void deleteNow(int id);
从你的Dao开始它会起作用

答案 1 :(得分:5)

  

@Delete注释将Dao注释类中的方法标记为   删除方法。该方法的实现将删除它   来自数据库的参数    Delete方法的所有参数必须是使用Entity注释的类或其集合/数组。

阅读here以获取更多信息。

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

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

答案 2 :(得分:-1)

  

错误:任务&#39;:app:compileDebugJavaWithJavac&#39;执行失败。 java.lang.IllegalArgumentException:int不能转换为Element

基本上,这个问题不仅出现在@Delete查询中,而且出现在所有Room的CRUD注释(@Insert@Delete@Update)之外@Query

这些CRUD注释方法的所有参数必须是使用Entity或其集合/数组注释的类。

所以我们不能传递原语或其他原语。