我有一个正在进行的Android项目,用户将有机会玩一些游戏,如tik tak toe,Rock’s aper’s cissors等。对于数据库,我使用Room persistence,所以我想创建12 …
您只需要预先填充数据库,如下所示:
@Database(entities = {City.class, WeekForecastItem.class, CurrentForecast.class}, version = 1) public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase INSTANCE; public abstract CityDao cityDao(); public abstract WeekForecastItemDao weekForecastItemDao(); public abstract CurrentForecastDao currentForecastDao(); public synchronized static AppDatabase getInstance(Context context) { if (INSTANCE == null) { INSTANCE = buildDatabase(context); } return INSTANCE; } private static AppDatabase buildDatabase(final Context context) { return Room.databaseBuilder(context, AppDatabase.class, "my-database") .addCallback(new Callback() { @Override public void onCreate(@NonNull SupportSQLiteDatabase db) { super.onCreate(db); Executors.newSingleThreadScheduledExecutor().execute(new Runnable() { @Override public void run() { getInstance(context).cityDao().insertAll(City.populateCityData()); } }); } }) .build(); } }`
@Entity public class City {
@PrimaryKey(autoGenerate = true) public long id; public String name; public int woeid; public City(String name, int woeid) { this.name = name; this.woeid = woeid; } public static City[] populateCityData() { return new City[]{ new City("Saint-Petersburg", 2123260), new City("Moscow", 2122265), }; } public void setId(long id) { this.id = id; } public long getId() { return id; } public String getName() { return name; } public int getWoeid() { return woeid; } }`
它对我的项目有类似的任务)
在Room中有两种方法可以做到这一点。
你可以创建一个 移民 添加这些硬编码游戏。这种方式当应用程序第一次运行插入代码时连接到数据库。这种方法的缺点是你不能使用你必须运行原始sql的DAO。但是保证每个只有一个实例,因为迁移只能在数据库版本之间运行。
在您的启动活动中,您可以运行任务(Coroutine,AsyncTask,...),该任务将首先检查游戏是否在那里,然后在没有的情况下插入它们。每个游戏最多需要2个查询,但它允许您在不更新数据库版本的情况下即时添加更多游戏。
我更喜欢2号自己,它更多一点处理,但更灵活。