Android Room:一个包含多个表的数据库

时间:2019-08-13 07:37:24

标签: java android android-room

我的应用程序有两个单独的表,一个称为用户,另一个称为密​​码。

用户:

@Entity(tableName = "users")
public class Users {
   // some setters and getters here
}

密码:

@Entity(tableName = "passwords")
public class Passwords {
   // some setters and getters here
}

这就是我访问数据库的方式:

usersdb = Room.databaseBuilder(this, Users.class,"mymaindb")
          .allowMainThreadQueries()
          .build();

// Then later in some other activity when I need to use passwords table

passwords = Room.databaseBuilder(this, passwords.class,"mymaindb")
          .allowMainThreadQueries()
          .build();

我遇到的问题是,全新安装后,当我访问密码时,我将无法访问用户,反之亦然。

我收到以下错误:

  

原因:java.lang.IllegalStateException:房间无法验证   数据的完整性。看起来您已经更改了架构,却忘记了更新   版本号。您可以通过增加版本来解决此问题   数字。

但是当我尝试使用两个单独的数据库(例如passwords_db和users_db而不是mymaindb)时,它就可以正常工作。

那么有没有一种方法可以在一个数据库下拥有多个表?如果是这样,那我在做什么错呢?预先感谢!

5 个答案:

答案 0 :(得分:0)

您有几种方法可以解决此问题:

  • 向后添加表,但增加数据库版本;

    @Database(entities={Users.class, Passwords.class}, version = 2)

  • 清除应用程序设置并构建新数据库;

只需清理应用程序缓存并尝试重新创建数据库。

答案 1 :(得分:0)

我认为您完全错了,Room.databaseBuilder仅应被调用一次以设置数据库,并且在该数据库类中,您将构造多个表。例如:

Room.databaseBuilder(this, MyRoomDb.class, "mymaindb")
                .allowMainThreadQueries()
                .build()

您的MyRoomDb应该看起来像这样

@Database(
        entities = {
            Users.class,
            Passwords.class
        },
        version = VERSION
)
public abstract class MyRoomDb extends RoomDatabase {
...
}

答案 2 :(得分:0)

如果您不想更改代码,则只需卸载并重新安装该应用程序即可。但这会删除您到目前为止保存在数据库中的数据。

答案 3 :(得分:0)

这是通过对所有表使用一个RoomDB类来获得所需内容的另一种方法:

@Database(entities = {Users.class, Passwords.class}, version = 1, exportSchema = false)
public abstract class MyDatabase extends RoomDatabase {
private static MyDatabase INSTANCE;

    public abstract UsersDAO usersDAO();
    public abstract PasswordsDAO passwordsDAO();

    public static MyDatabase getDatabase(Context context) {
        if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                    MyDatabase.class, "mydatabase")
                    .build();
        }
        return INSTANCE;
    }
}

您的实体将如下所示:

@Entity(tableName = "user_table")
public class User {

    @PrimaryKey(autoGenerate = true)
    private long id;
    private String username;
    private String email;

    .............//Constructor goes here

    .............//Getters and Setters go here

}

DAO看起来像这样:

@Dao
public interface UsersDAO {

    @Query("SELECT * FROM user_table")
    List<User> getAll();

}

然后您将像这样获取数据:

AsyncTask.execute(() -> {               
    MyDatabase.getDatabase(getApplicationContext()).usersDAO().getAll();
});

答案 4 :(得分:0)

就像添加一个实体表一样简单。只需使用 "," 添加另一个表名。并且将添加另一个表。

@Database(entities = [TableUser::class, TableRecord::class], version = 1)

abstract class MyDatabase : RoomDatabase() {
    abstract fun myDao(): MyDao
}