繁体   English   中英

Android Room:一个数据库多表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM