繁体   English   中英

如何在房间数据库中插入测试数据

[英]How to insert test data in room database

如何在应用程序启动之前在房间数据库中插入测试数据? 我试图在我的视图模型中添加回调

AppDatabase appDatabase = Room.databaseBuilder(application, AppDatabase.class, "db")
                .fallbackToDestructiveMigration()
                .addCallback(new DatabaseCallback())
                .allowMainThreadQueries()
                .build();

回调代码是这样的:

@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
    super.onCreate(db);
}

@Override
public void onOpen(@NonNull SupportSQLiteDatabase db) {
    super.onOpen(db);
    db.beginTransaction();
    db.execSQL("INSERT INTO Sport('sportName','gender','sportType') VALUES(?,?,?)",new Object[]{"Basketball","BOTH","TEAM"});
    db.execSQL("INSERT INTO Sport('sportName','gender','sportType') VALUES(?,?,?)",new Object[]{"Football","MALE","TEAM"});
    db.execSQL("INSERT INTO Sport('sportName','gender','sportType') VALUES(?,?,?)",new Object[]{"Ping Pong","BOTH","SINGLE"});
    db.endTransaction();
}

@Override
public void onDestructiveMigration(@NonNull SupportSQLiteDatabase db) {
    super.onDestructiveMigration(db);
}

onCreate 从未被调用(我不知道为什么)。我认为这是因为备份,所以我在清单中禁用了它 - 但仍然没有调用 onCreate。如果有人知道为什么,请告诉我。 在调用第一个房间方法之后而不是之前调用 onOpen。但即使这样,在第二次查询数据之后(在调用 onOpen 之后),数据仍然不存在。有 Sport 实体:

@Entity

公开决赛 class 运动 {

@PrimaryKey(autoGenerate = true)
private long sportId;

private String sportName;

private Gender gender;

private SportType sportType;

public Sport(long sportId, String sportName, Gender gender, SportType sportType) {
    this.sportId = sportId;
    this.sportName = sportName;
    this.gender = gender;
    this.sportType = sportType;
}

public long getSportId() {
    return sportId;
}

public String getSportName() {
    return sportName;
}

public Gender getGender() {
    return gender;
}

public void setGender(Gender gender) {
    this.gender = gender;
}

public SportType getSportType() {
    return sportType;
}

public void setSportType(SportType sportType) {
    this.sportType = sportType;
}

}

这是 DAO 类(我调用 loadAllSports,但返回的是空列表):

@Dao

公共接口 SportDao {

@Query("SELECT * FROM Sport")
List<Sport> loadAllSports();

@Insert
void insertSport(Sport sport);

@Update
void updateSport(Sport sport);

@Delete
void deleteSport(Sport sport);

@Query("SELECT sportId,sportName FROM Sport")
LiveData<List<SportIdNameModel>> sportIdsAndNames();

}

这是数据库 class:

@Database(entities = {Team.class, Athlete.class, Sport.class}, version = 3)

@TypeConverters({LocalDateConverter.class, GenderConverter.class, SportTypeConverter.class}) 公共抽象 class AppDatabase 扩展 RoomDatabase

public abstract AthleteDao athleteDao();

public abstract TeamDao teamDao();

public abstract SportDao sportDao();

}

在您的数据库中 class

@Database(entities = {Team.class, Athlete.class, Sport.class}, version = 3)
@TypeConverters({LocalDateConverter.class, GenderConverter.class, SportTypeConverter.class}) 
public abstract class AppDatabase extends RoomDatabase {
    public abstract AthleteDao athleteDao();
    public abstract TeamDao teamDao();
    public abstract SportDao sportDao();

class CallBack extends RoomDatabase.Callback {
    @Override
    public void onCreate(@NonNull SupportSQLiteDatabase db) {
        super.onCreate(db);

        db.beginTransaction();
        db.execSQL("INSERT INTO Sport('sportName','gender','sportType') VALUES(?,?,?)",new Object[]{"Basketball","BOTH","TEAM"});
        db.execSQL("INSERT INTO Sport('sportName','gender','sportType') VALUES(?,?,?)",new Object[]{"Football","MALE","TEAM"});
        db.execSQL("INSERT INTO Sport('sportName','gender','sportType') VALUES(?,?,?)",new Object[]{"Ping Pong","BOTH","SINGLE"});
        db.endTransaction();
    }
}

然后

AppDatabase appDatabase = Room.databaseBuilder(application, AppDatabase.class, "db")
                .fallbackToDestructiveMigration()
                .addCallback(new AppDatabase.CallBack())
                .allowMainThreadQueries()
                .build();

首次向数据库添加数据时,您需要重写 onCreate 方法。 为了在每次打开数据库时执行某些操作,您必须重写 onOpen 方法。

看看这个: https://medium.com/androiddevelopers/7-pro-tips-for-room-fbadea4bfbd1#4785

Here is how it's done in the android sunflower demo: https://github.com/android/sunflower/blob/46c0db57a4a7bae070c66fd390b920de4c3cf27f/app/src/main/java/com/google/samples/apps/sunflower/data/AppDatabase.kt #L54

编辑:我第一眼看到你的代码和谷歌的最大区别之一是你把你的播种逻辑放在onOpen里面,而他们把他们的放在onCreate

Edit2:他们也将插入语句移至 IO 线程

Edit3:他们也使用了他们的 daos,而不是 execSql

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM