我计划开始将现有应用程序迁移到Architecture Components,我的一个疑问是我应该如何组织新代码。
我有一些表添加到个人库中,这些表只包含在某些版本中,如果主应用程序中存在数据库类,那么如何将这些实体和DAO添加到主应用程序中?
我应该向库中添加另一个数据库类吗?如果是这样,它是否会与主应用程序中的现有Database类冲突?
我一直在搜索,但未能找到任何示例或教程...
修改以澄清数据库问题
从我理解的文档中,在数据库抽象类中,您必须告诉实体存在,并为DAO创建访问方法。 如果库中有实体,怎么办呢?
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
答案 0 :(得分:1)
@Database(version = 1, entities = {User.class, Book.class})
abstract class AppDatabase extends RoomDatabase
{
// BookDao is a class annotated with @Dao.
abstract public BookDao bookDao();
// UserDao is a class annotated with @Dao.
abstract public UserDao userDao();
// UserBookDao is a class annotated with @Dao.
abstract public UserBookDao userBookDao();
}
如果你想更新房间数据库并添加表...只需添加另一个实体,然后更新版本,如果你添加另一个实体,如电影表..做这样的事情
@Database(version = 2, entities = {User.class, Book.class, Movies.class})
abstract class AppDatabase extends RoomDatabase {
// BookDao is a class annotated with @Dao.
abstract public BookDao bookDao();
// UserDao is a class annotated with @Dao.
abstract public UserDao userDao();
// UserBookDao is a class annotated with @Dao.
abstract public UserBookDao userBookDao();
// MoviesDao is a class annotated with @Dao.
abstract public MoviesDao moviesDao();
// UserMoviesDao is a class annotated with @Dao.
abstract public UserMoviesDao userMoviesDao();
}
供参考,您可以查看... https://developer.android.com/reference/android/arch/persistence/room/Database.html以供参考..
答案 1 :(得分:1)
和Kotlin在一起:
@Database(version = 1, entities = [User::class, Book::class])
abstract class AppDatabase : RoomDatabase() {
//UserDao is a class annotated with @Dao
abstract fun userDao(): UserDao
// BookDao is a class annotated with @Dao
abstract fun bookDao(): BookDao
}
答案 2 :(得分:0)
简捷。
向房间数据库添加新表。
1)创建一个新表 -您可以通过创建带有注释的Java类来完成 @Entity(tableName =“ user_data”) -在此表内,您将创建表中想要的所有列/字段。
2)创建一个新的DAO(数据访问对象) -我们知道我们有一个模型类(java)。我们把它像一个物体一样拿起来, 因此,请创建带有注释的接口 @道 -因为它将具有所有SQL查询语句,并充当数据库和命令之间的中间(接口)。
3)将新表添加到数据库中 -在此请小心,如果操作不正确,则可能会丢失数据,或者您的应用可能会崩溃。
首先将您创建的表类添加到实体属性
@Database(实体= {TableOne.class,UserData.class},版本= 1)
第二个注意事项是我们不会将版本号从1增加到2,这将向您解释我们这样做的原因。
第3次添加此抽象方法,以便可以根据需要在每个位置覆盖它。
公共抽象UserDataDAO getUserDataDao();
第四,这与您之前使用单个表的情况相同。
private static final String DB_Name = "myDatabase";
private static DataBase instance;
public static synchronized DataBase getInstance(Context context)
{
if(instance == null)
{
instance =
Room.databaseBuilder(context.getApplicationContext(),DataBase.class,DB_Name)
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.build();
}
return instance;
}
添加新表后的第五天,代码将如下所示
@Database(entities = {TableOne.class,UserData.class},version = 1)
public abstract class DataBase extends RoomDatabase {
private static final String DB_Name = "myDatabase";
private static DataBase instance;
public abstract tableOne getTableOneDao();
public abstract UserDataDAO getUserDataDao();
public static synchronized DataBase getInstance(Context context)
{
if(instance == null)
{
instance =
Room.databaseBuilder(context.getApplicationContext(),DataBase.class,DB_Name)
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.build();
}
return instance;
}
}
6th现在卸载该应用程序,如果您已经将其安装在设备中,则由于我们没有迁移和更改,这就是为什么我没有增加版本的原因。
现在第7天,当您重新安装应用程序时,它将处理两个表。
采用这种策略进行的第8次操作是不可行的,因为您的数据会丢失。
您需要迁移应用的第9个 通过增加版本号来更改,然后编写一个静态方法来讲述迁移。
please look for this blog where you find awesome migration technique with clear explanation.
答案 3 :(得分:0)
使用Kotlin,您可以使用数组文字。像示例代码和更高版本的数据库一样添加您的实体:
Database(
entities = [Product::class, Category::class],
version = version + 1,
exportSchema = false)
答案 4 :(得分:0)
Room持久性库支持通过以下方式进行增量迁移: 迁移类可满足此需求。每个迁移子类 定义了startVersion和endVersion之间的迁移路径。
因此,正确的答案(也是正确的方法,因为您不应该使用fallbackToDestructiveMigration)是:
将新表添加为Java类
@Entity(tableName = "Fruit")
public class Fruit implements Parcelable {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(index = true, name = "id")
private int id;
@ColumnInfo(name = "name")
private String name;
...
}
更新数据库版本并在实体声明中添加您的实体(您添加类定义以告知Room应该考虑该类)并添加dao getter
@Database(version = 2, entities = {User.class, Fruit.class})
abstract class AppDatabase extends RoomDatabase {
abstract public UserDao userDao();
abstract public FruitDao fruitDao();
}
使用这样的数据库构建器添加迁移sql脚本
public static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE `Fruit` (`id` INTEGER, "
+ "`name` TEXT, PRIMARY KEY(`id`))");
}
};
Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name")
.addMigrations(MIGRATION_1_2).build();
来源:https://developer.android.com/training/data-storage/room/migrating-db-versions