web-dev-qa-db-ja.com

Room IllegalArgumentException:intを要素に変換できません

プロジェクトをコンパイルしようとすると、次のエラーが発生します。

エラー:タスク ':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(無効にして再起動します)。

10
Scarass

削除する

@Delete
public abstract void deleteNow(int id);

あなたのダオからそれは動作します

11
Vikash

@Deleteアノテーションは、Daoアノテーション付きクラスのメソッドを削除メソッドとしてマークします。メソッドの実装は、データベースからそのパラメーターを削除します。
Deleteメソッドのパラメーターのすべては、Entityでアノテーションが付けられたクラスまたはそのコレクション/配列である必要があります。

詳細については、 ここ をお読みください。

したがって、あなたの場合、前述のルールに違反するint型のパラメーターを渡します。そのため、このエラーが発生します。

この問題を解決するには、deleteNowメソッドを除外するか、上記のルールに違反しないパラメーターを渡す必要があります。

8
0__1

エラー:タスク ':app:compileDebugJavaWithJavac'の実行に失敗しました。 Java.lang.IllegalArgumentException:intを要素に変換できません

基本的に、この問題は@Deleteクエリだけでなく、@Insertを除くすべてのRoomのCRUDアノテーション(@Delete@Update@Query)によっても発生します。

これらのCRUDアノテーション付きメソッドのすべてのパラメーターは、Entityアノテーションが付けられたクラスまたはそのコレクション/配列である必要があります。

したがって、プリミティブまたはこれら以外を渡すことはできません。

1
vivek singh