[英]Want to Insert Data in multiple tables according to different class objects in Android Application using Room Database Library transaction
[英]Android Room: One database with multiple tables
我的应用程序有两个单独的表,一个称为用户,另一个称为密码。
用户:
@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: Room 无法验证数据完整性。 看起来您已更改架构但忘记更新版本号。 您可以通过增加版本号来简单地解决此问题。
但是当我尝试使用两个独立的数据库(如 passwords_db 和 users_db 而不是 mymaindb)时,它就完全正常了。
那么有没有一种方法可以在一个数据库下拥有多个表? 如果是这样,那我做错了什么? 提前致谢!
我认为这一切都错了, 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 {
...
}
您有几个变体可以解决这个问题:
添加表,但增加数据库的版本;
@Database(entities={Users.class, Passwords.class}, version = 2)
清理应用程序设置并构建新数据库;
只需清理应用程序缓存并尝试重新创建数据库。
如果您不想更改代码,只需卸载并重新安装该应用程序即可。 但这将删除您保存在数据库中的数据。
这是您可以通过为所有表使用一个 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();
});
就像添加一个实体表一样简单。 只需使用","添加另一个表名。 并且将添加另一个表。
@Database(entities = [TableUser::class, TableRecord::class], version = 1)
abstract class MyDatabase : RoomDatabase() {
abstract fun myDao(): MyDao
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.