プロジェクトをコンパイルしようとすると、次のエラーが発生します。
エラー:タスク ':app:compileDebugJavaWithJavac'の実行に失敗しました。 Java.lang.IllegalArgumentException:intを要素に変換できません
そしてこの警告:
警告:アノテーションプロセッサ「Android.Arch.persistence.room.RoomProcessor」からサポートされているソースバージョン「RELEASE_7」が-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);
あなたのダオからそれは動作します
@Delete
アノテーションは、Daoアノテーション付きクラスのメソッドを削除メソッドとしてマークします。メソッドの実装は、データベースからそのパラメーターを削除します。
Deleteメソッドのパラメーターのすべては、Entity
でアノテーションが付けられたクラスまたはそのコレクション/配列である必要があります。
詳細については、 ここ をお読みください。
したがって、あなたの場合、前述のルールに違反するint
型のパラメーターを渡します。そのため、このエラーが発生します。
この問題を解決するには、deleteNow
メソッドを除外するか、上記のルールに違反しないパラメーターを渡す必要があります。
エラー:タスク ':app:compileDebugJavaWithJavac'の実行に失敗しました。 Java.lang.IllegalArgumentException:intを要素に変換できません
基本的に、この問題は@Delete
クエリだけでなく、@Insert
を除くすべてのRoomのCRUDアノテーション(@Delete
、@Update
、@Query
)によっても発生します。
これらのCRUDアノテーション付きメソッドのすべてのパラメーターは、Entityアノテーションが付けられたクラスまたはそのコレクション/配列である必要があります。
したがって、プリミティブまたはこれら以外を渡すことはできません。