我的应用程序有两个单独的表,一个称为用户,另一个称为密码。
用户:
@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)时,它就可以正常工作。
那么有没有一种方法可以在一个数据库下拥有多个表?如果是这样,那我在做什么错呢?预先感谢!
答案 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
}