【问题标题】:Room with Multi user Database in Single android App单个 android 应用程序中具有多用户数据库的房间
【发布时间】:2018-11-21 16:49:27
【问题描述】:

我们可以使用 Room 在单个 android 应用程序中拥有多个数据库吗?我想为每个用户创建一个新数据库。如果 user1 登录,我必须为该用户创建一个数据库,如 UserDB1,如果添加了任何新帐户,我必须为该用户创建另一个数据库,如 UserDb2。如果帐户之间发生帐户切换,我应该访问用户特定的数据库。我该如何实现?

【问题讨论】:

标签: android database kotlin android-room accountmanager


【解决方案1】:

我是这样做的,如下所示,

    private static AppDatabase buildDatabase(final Context appContext, int userId) {
    return Room.databaseBuilder(appContext, AppDatabase.class, DATABASE_NAME + "_" + userId)
            .addCallback(new Callback() {
                @Override
                public void onCreate(@NonNull SupportSQLiteDatabase db) {
                    super.onCreate(db);

                }
            })
        .build();
}

我完全理解您的要求。有3种方式, (假设只需要一个表 userTable,但实际上我们还有更多。)

  1. 为每个登录用户创建一个数据库。 (你问,我也用过)
  2. 只是一个数据库,但是为每个用户创建一个表,比如userTable_1。 (好像Room支持不了)
  3. 所有用户只有一个数据库和一个表,所以我们必须在表中添加一个额外的列user_id;如果我们有 20 个表,我们必须将“user_id”添加到所有 20 个表中。 (我们大部分时间都是在后端开发中完成的;但在这种情况下,我真的不喜欢这个)

【讨论】:

  • 这将如何与像 Hilt 这样的依赖注入框架一起工作?你如何确定这个范围?如果数据库范围为单例,每个用户仍将获得相同的数据库实例
【解决方案2】:

也许你可以,但由于几个原因,这种方法是错误的。您不会为用户创建单独的数据库,而是创建相互关联的表,每一行都是用户的一个条目。
有些表具有一对多的关系,例如保存订单号的表。一个用户可能有很多订单。或者该表可能具有像用户配置文件那样的一对一关系。它分解为,每个用户都有一个唯一的条目和 ID,该 ID 将与其他表及其数据相关。您使用登录人的 ID 来获取他们的数据。 除此之外,您真的不应该在您的应用程序中存储其他人的数据,您认为多个人会为该应用程序使用同一部手机的情况是什么?理想的情况是拥有一个基于云的服务器/数据库,您可以从中获取数据,以便只检索当前用户的数据。
你不做多个数据库的最后一个原因是,如果你想添加一个新字段,你必须更新每个创建的数据库,而不仅仅是一个。

【讨论】:

  • 感谢您的评论。但你不明白我的询问。我想在 gmail 等应用程序中保留多个登录用户。每当我切换帐户时,我都想访问特定的用户数据。我不认为这种方法是错误的。你仍然认为这种方法是错误的,请用清晰的例子或任何参考来解释我。
  • 您真的认为 gmail 为每个用户都有一个数据库吗?或者他们将所有电子邮件存储在您的手机上?无论您将数据存储在手机上还是服务器上,主体都是相同的,即一个包含所有用户的表条目的数据库。对于 gmail 之类的东西,他们在手机上存储的唯一内容是每个登录者的电子邮件地址。
  • 没关系,但你错过了理解我的问题。
  • @karthi ,我想你不明白上面解释了什么。解决这个问题的最好方法是定义一个对每个用户都是唯一的表。
  • 是的,迁移过程对于多个数据库来说会是一件痛苦的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2015-12-16
  • 2018-07-13
  • 2020-03-11
  • 2014-01-13
  • 1970-01-01
相关资源
最近更新 更多