Держите мою базу данных комнат на месте, но она продолжает падать.Я использую это неправильно?(Android, Java) - PullRequest
0 голосов
/ 17 декабря 2018

Я правильно настроил свою базу данных Room (я думаю) и встроил ее в свою AsyncTask, чтобы она не блокировала основной поток.Но когда я использую insert из Dao, он вылетает с ошибками RuntimeException: An error occurred while executing doInBackground() и SQLiteConstraintException: UNIQUE constraint failed: users.id.Он вылетает на линии, где я пытаюсь вставить данные в database myDatabase.getUserDao().insert( user1, user2 );

Вот мой AsyncTask

public class MyAsyncTask extends AsyncTask<Void, Void, Void> {

    private WeakReference<Context> contextRef;
    public MyAsyncTask(Context context) {
        this.contextRef = new WeakReference<Context>( context );
    }

    protected Void doInBackground(Void... notused) {
        Log.d("TAG ", "BACKGROUND STUFF");

        Context context = contextRef.get();

        MyDatabase myDatabase = Room.databaseBuilder(
            context,
            MyDatabase.class,
            "myDatabase.db")
            .build();

        UserEntity user1 = new UserEntity();
        user1.setId( 22 );
        user1.setName( "TESTING1" );

        UserEntity user2 = new UserEntity();
        user2.setId( 3 );
        user2.setName( "TESTING2" );

        myDatabase.getUserDao().insert( user1, user2 );

    return null;
    }

    protected void onProgressUpdate(Void... values){}

    @Override
    protected void onPostExecute(Void result) {}

}

Database

@Database( entities = {UserEntity.class}, version = 1, exportSchema = false)
public abstract class MyDatabase extends RoomDatabase {

    public abstract UserDao getUserDao();

}

Dao interface:

@Dao
public interface UserDao {

    @Insert
    void insert(UserEntity... users);

    @Query( "SELECT * FROM users" )
    List<UserEntity>getAllUsers();

    @Update
    void update(UserEntity... users);

    @Delete
    void delete(UserEntity... userEntities);   
}

И Entity класс:

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

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    private int id;
    @ColumnInfo(name = "name")
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Я делаю это неправильно?И еще одна вещь, которую я не могу решить.Как только я успешно поместил данные в Room, как я могу использовать интерфейс getAllUsers()?

ОБНОВЛЕНИЕ Забыли onCreate(), хотя не так много, чтобы показать.

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.activity_main );

    MyAsyncTask myAsyncTask = new MyAsyncTask(this);
    myAsyncTask.execute(  );
}
...