1

我正在使用 moor_flutter 将我的数据保存在我的 Flutter 应用程序的 SQLite 数据库中。为了论证,我的专栏之一是这样的:

class Clients extends Table {
  // Autoincrement automatically sets this to be a primary key
  IntColumn get id => integer().autoIncrement()();
  TextColumn get name => text().withLength(min: 1, max: 60)();
  TextColumn get phone => text().withLength(min: 1, max: 50)();
}

我希望将我最近打开的一组客户端存储在长度为 10 的列表中。每次有人与该客户端交互时,该列表都会将该客户端放在列表的顶部并删除最后一个,以便它将始终为 10。它还可以将它们重新排序为从中间到顶部冒泡一个。

无论如何,我要做的是创建一个名为“Recents”的新表,该表将有一个 List 类型的字段,如下所示:

class Recents extends Table {
  List<Client> recents => List<Client>[10].withLength(min: 0, max:10)()();
}

我在 interwebz 上找不到任何可用的东西,所以我们是 StackOverflowers!你将如何解决这个难题?

4

1 回答 1

2
  1. SQLite 数据库中没有任何好的方法可以将列表存储在表的单个列中,自然的方法是将列表项存储在另一个表中,其中每一行代表列表中的一个项目,并将其与与其他表的关系例如,如果考虑一个场景,我们有一个用户表,并且每个用户实体都有一个与之关联的电话号码列表,我们可以将所有用户存储在用户表中,并将所有电话号码存储在其他表中,并且我们将在电话号码表中创建一个 userId 列,并为每个电话号码添加一个 userId,表明此电话号码与具有唯一 userId“关系”的特定用户相关联这样,当我们想要获取用户的电话号码列表时,我们可以在电话号码表中查询具有特定 userId 的电话号码

用户表

用户身份 用户名
0 一个
1
3 C

电话号码表

ID 电话号码 用户身份
0 +099888 0
1 +121181288 0
2 +31188218 0
3 +121221295 1
4 +9852121328 2
5 +2512165 2
  1. 处理这种情况的第二种方法是将 List 转换为 SQLite 支持的类型,例如将列表项转换为 JSON 字符串并将其作为文本插入到用户表的列中,当您阅读此字段时,您可以将其转换为项目列表,大多数 ORM 将提供一个工具,可以帮助您与我们一起为沼地提供 secnario,您可以使用转换器这里是文档的链接 https://moor.simonbinder.eu/docs/高级功能/type_converters/

但请注意,这种方法不太灵活,例如您无法查询电话号码,并且对性能有不良影响

于 2021-04-19T19:20:45.327 回答