文件室数据库向数据库中添加的项目不能超过1个



在这个Android Studio示例中,我完成了房间数据库架构,并试图将一些人插入到我的数据库中,我在PersonRoomDatabase类中添加了person1和person2,但当我开始我的项目时,我在数据库检查器屏幕中只看到了person1。我试图在我的主活动中添加person3,但它也不起作用。即使我更改了person1的名称,它仍然是";saul";。很快,我就无法将任何Person对象添加或插入到我的数据库ecxept person1中。如果你能帮助我,我将不胜感激;3

1.(RoomDatabase类:

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

public abstract PersonDAO personRoomDAO();
private static volatile PersonRoomDatabase INSTANCE;
public static final int NUMBER_OF_THREADS=4;
static final ExecutorService databaseWriteExecutor=enter code here
Executors.newFixedThreadPool(NUMBER_OF_THREADS);
//We defined singleton for PersonRoomDatabase so there will be just one Database
static final PersonRoomDatabase getDatabase(final Context context){
if (INSTANCE==null){
synchronized (PersonRoomDatabase.class){
if (INSTANCE==null){
INSTANCE= Room.databaseBuilder(context.getApplicationContext(),
PersonRoomDatabase.class,"person_database")
.addCallback(sRoomDatabaseCallback)
.build();
}
}
}
return INSTANCE;
}
private static RoomDatabase.Callback sRoomDatabaseCallback = new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
databaseWriteExecutor.execute(() -> {

PersonDAO dao = INSTANCE.personRoomDAO();
dao.deleteAll();
Person person1=new Person("saul","goodman");
dao.insert(person1);
Person person2=new Person("walter","white");
dao.insert(person2);

});
}
};
}

2.(DAO类:

@Dao
public interface PersonDAO {
@Insert(onConflict = OnConflictStrategy.IGNORE)
void insert(Person person);
@Query("DELETE FROM person_table")
void deleteAll();
@Query("SELECT * FROM person_table ORDER BY name ASC")
LiveData<List<Person>> selectAllPerson();
}

3.(视图模型类:

public class PersonViewModel extends AndroidViewModel {
private PersonRepository personViewModelRepository;
private final LiveData<List<Person>> allPersonViewModel;
public PersonViewModel(@NonNull Application application) {
super(application);
personViewModelRepository=new PersonRepository(application);
allPersonViewModel=personViewModelRepository.getAllPersonsRepository();
}
public LiveData<List<Person>> getAllPersonViewModel(){return allPersonViewModel;}
public void insert(Person person){ personViewModelRepository.insert(person);}
public void deleteAll(){personViewModelRepository.deleteAll();}
}

4.(存储库类别:

public class PersonRepository {
private PersonDAO personRepositoryDAO;
private LiveData<List<Person>> allPersons;

PersonRepository (Application application){
PersonRoomDatabase db=PersonRoomDatabase.getDatabase(application);
personRepositoryDAO=db.personRoomDAO();
allPersons=personRepositoryDAO.selectAllPerson();
}

LiveData<List<Person>> getAllPersonsRepository() {
return allPersons;
}
exception. Room ensures
void insert(Person person){
PersonRoomDatabase.databaseWriteExecutor.execute(() ->
personRepositoryDAO.insert(person));
}
void deleteAll(){
PersonRoomDatabase.databaseWriteExecutor.execute(() ->
personRepositoryDAO.deleteAll());
}
}

5.(本人实体:

@Entity(tableName = "person_table")
public class Person {
@PrimaryKey
@ColumnInfo(name = "id")
private int id;
@ColumnInfo(name = "name")
private String name;
@ColumnInfo(name = "lastName")
private String lastName;
public Person(){
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public void setName(String name) {
this.name = name;
}
public Person(String name, String lastName) {
this.name = name;
this.lastName = lastName;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}

public String getName() {
return name;
}

public String getLastName() {
return lastName;
}
}

6.(主要活动:

public class MainActivity extends AppCompatActivity {
public Person person;
private PersonViewModel personViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
personViewModel= new ViewModelProvider.AndroidViewModelFactory(MainActivity.this
.getApplication())
.create(PersonViewModel.class);


Person person3=new Person("jesse","pinkman");
personViewModel.insert(person3);

personViewModel.getAllPersonViewModel().observe(this,person ->
Log.d("Observe", "onCreate: "+person.get(0).getName())

);


}
}

正如您所发现的,将@PrimaryKey(autoGenerate = true)添加到id字段可以在不手动指定id的情况下正确插入。

之前只有一个人被添加到表中(尽管多次调用insert(的原因是,当您使用public Person(String name, String lastName)构造函数时,Java会自动将id初始化为默认的int值0。因此,您创建的所有Person对象都具有主键0。第一次插入其中一个实例时,数据库中没有主键为0的行,因此插入成功。在随后的调用中,主键为0的Person已经存在,因此没有插入新的Person。这是Room插入方法的默认行为,但您可以更改它。例如,如果您希望新条目替换旧条目,可以将注释@Insert(onConflict = OnConflictStrategy.REPLACE)添加到插入方法中。请参阅此处查看可能的行为列表。

伙计们,我终于发现了问题所在:当我试图插入一个person对象时,我只写了name和lastname,但我忘记的是id。所以对象无法创建并插入到我们的数据库中。解决方案是,我在Primary中添加了id字段(aoutoGenerate=true(,因此即使我没有插入id,它也会自动生成id。

但我不明白的是,即使我一开始没有插入id(在我编码aoutoGenerate=true之前(,也只需要一个人就可以坐到桌子旁,有人能解释吗?

最新更新