Я правильно настроил свою базу данных 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( );
}