如何在没有用户表的情况下创建用户和表之间的关系

问题描述 投票:0回答:1

我正在为 Android 创建一个天气应用程序。我使用本地数据库 SQLite,有空间。我想知道如何在用户和最喜欢的位置之间创建一对一的关系。由于我认为天气应用程序中的身份验证毫无意义,因此我放弃了创建实体“用户”。我创建了一个名为“搜索历史”的实体(这似乎是一对多关系),它根据用户最近的搜索向用户提供提示。

@Entity(tableName = "search_history")
public class SearchHistoryEntry {

    @PrimaryKey(autoGenerate = true)
    public int id;
    public String cityName;
    public String date;

    public SearchHistoryEntry(String cityName, String date) {
        this.cityName = cityName;
        this.date = date;
    }
}

现在我想知道如何在没有物理用户实体的用户和最喜欢的位置之间创建一对一的关系。

也许我应该创建一个只有 user_id 的表 user ?

android sqlite android-room
1个回答
0
投票

你想让这个最爱继续下去吗?

  • 如果是这样,那么它必须存储在某个地方;数据库或共享偏好。

它是否可能只是搜索历史中最流行的城市名称,如果是这样,则不需要将其存储在任何地方,因为查询可以获得最常用/流行的城市名称。

数据库(机房)解决方案

如果前者和数据库则可以使用单列单行表。

也许类似

@Entity
public class TheOneAndOnlyFavourite(
    @PrimaryKey
    String cityName;
    .... constructors, getters and setters
)

问题在于要么维护单个此类值,要么确定多个值中的哪一个是所需的最喜欢的城市名称,例如何时以及是否要更改最喜欢的城市名称。

  • 请注意,您应该使用
    @Insert(onConflictStrategy = OnConflictStrategy.IGNORE
    )来防止尝试插入相同 CityName 时出现问题(唯一冲突,因为主键是隐式唯一的,因此将被忽略,而不是导致异常)。

您可以通过插入一次然后随后更新来仅维护一行(请注意,您无法利用 Room 便利

@Update
,因为主键用于标识要更新的行,如果更改,则不会更新任何内容) 。您需要使用
@Query("UPDATE TheOneAndOnlyFavourite SET cityName=:newCityName;")

您可以有很多行,并根据存在的通常隐藏的 rowid 选择最新插入的行。使用类似

("SELECT * FROM TheOneAndOnlyFavourite ORDER BY rowid DESC LIMIT 1")
.

的东西
  • 显然,随着时间的推移,可能会添加更多行,因此这可能会对数据库的大小产生影响。但是,表会分配存储块(页)(默认为 4k),并且表至少有 1 个这样的页。因此,仅拥有该表就会消耗 4k,在需要另一个 4k 之前,它可以容纳相当多的行。

将收藏夹作为此表意味着它可以用作选择收藏夹的标准,而无需将收藏夹作为值获取,然后传递给查询以从搜索历史记录中选择收藏夹。

© www.soinside.com 2019 - 2024. All rights reserved.