【问题标题】:Moor flutter List<MyTable> datatypeMoor flutter List<MyTable> 数据类型
【发布时间】:2021-07-13 22:56:35
【问题描述】:

我正在使用 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!您将如何解决这个难题?

【问题讨论】:

    标签: android ios sqlite flutter flutter-moor


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

    用户表

    UserId Username
    0 A
    1 B
    3 C

    电话号码表

    Id PhoneNumber UserId
    0 +099888 0
    1 +121181288 0
    2 +31188218 0
    3 +121221295 1
    4 +9852121328 2
    5 +2512165 2
    1. 处理这种情况的第二种方法是将 List 转换为 SQLite 支持的类型,例如将列表项转换为 JSON 字符串并将其作为文本插入到用户表的列中,当您阅读此内容时字段,您可以将其转换为项目列表,大多数 ORM 将提供一个工具来帮助您了解我们 对于沼地,您可以使用转换器这里是文档的链接 https://moor.simonbinder.eu/docs/advanced-features/type_converters/

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

    【讨论】:

    • 这是部分回答问题,因为第 1 部分与我的问题并没有特别相关。但是我可能会考虑选项 2,可以工作的是最近表中的单行,其中包含一个 JSON 字符串,其中包含 10 个最近的客户端详细信息,每次都会更新。这样做可能有点贵,但我会试一试。谢谢阿米尔!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多