如何在Room中添加新表?

时间:2018-02-12 09:35:36

标签: android android-library android-room

我计划开始将现有应用程序迁移到Architecture Components,我的一个疑问是我应该如何组织新代码。

我有一些表添加到个人库中,这些表只包含在某些版本中,如果主应用程序中存在数据库类,那么如何将这些实体和DAO添加到主应用程序中?

我应该向库中添加另一个数据库类吗?如果是这样,它是否会与主应用程序中的现有Database类冲突?

我一直在搜索,但未能找到任何示例或教程...

修改以澄清数据库问题

从我理解的文档中,在数据库抽象类中,您必须告诉实体存在,并为DAO创建访问方法。 如果库中有实体,怎么办呢?

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

5 个答案:

答案 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.

check here

答案 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