android 如何在库中添加新表?

k4ymrczo  于 2023-03-16  发布在  Android
关注(0)|答案(5)|浏览(193)

我正计划开始将一个现有的应用程序迁移到架构组件,我的一个疑问是我应该如何组织新的代码。
我有一些表被添加到个人库中,而个人库只包含在某些风格中,如果数据库类存在于主应用程序中,那么如何将这些实体和DAO添加到主应用程序中呢?
我应该添加另一个数据库类到库中吗?如果是这样,它不会与主应用程序中现有的数据库类冲突吗?
我一直在寻找,但还没有能够找到任何例子或教程...

编辑以阐明数据库问题

从文档中我了解到,在数据库抽象类中,你必须告诉哪些实体存在,并且还要为DAO创建访问方法。如果库中有实体,怎么做呢?

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

wn9m85ua1#

@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();
}

有关参考,您可以查看... this

mrwjdhj3

mrwjdhj32#

Room持久化库通过Migration类支持增量迁移来满足这一需求。每个Migration子类定义了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

cl25kdpy

cl25kdpy3#

与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   
        }
u0njafvf

u0njafvf4#

找条捷径。
向房间数据库添加新表。
1)创建一个新的表-你可以通过创建一个带有@Entity(tableName =“user_data”)注解的java类来实现-在这个表中你将创建你想要的所有列/字段。
2)创建一个新的DAO(数据访问对象)-正如我们所知,我们有一个模型类(java)。我们持有它像一个对象,检索,所以,创建一个接口与注解@Dao -因为这将有所有的SQL查询语句,并作为一个中间(接口)之间的数据库,和您的命令。
3)添加您的新表到数据库-在这里要小心,如果你做错了,你可能会丢失数据,或者你的应用程序可能会崩溃。
首先,将您创建的表类添加到实体属性
@数据库(实体= {表一.类,用户数据.类},版本= 1)
第二个注意,我们不增加版本号从1到2,将解释你下面你,我们这样做。
第三,添加这个抽象方法,这样就可以根据需要在任何地方重写它。
公共抽象用户数据DAO 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;
}

}
现在卸载应用程序,如果你已经安装在您的设备,因为我们没有迁移和更改,这就是为什么我没有增加版本.
现在,当你安装你的应用程序新鲜,它将处理与两个表。
第八,通过这样做在这个策略是不值得赞赏的,因为你的数据丢失.
第九,你需要迁移应用程序,通过增加版本号来改变版本号,然后编写一个静态方法来告知迁移。

please look for this blog where you find awesome migration technique with clear explanation.

check here

yws3nbqq

yws3nbqq5#

在Kotlin中你可以使用一个数组字面值。添加你的实体,就像在示例代码和更高的数据库版本中:

Database(
entities = [Product::class, Category::class], 
version = version + 1, 
exportSchema = false)

相关问题