【问题标题】:Storing/retrieving highly dynamic data from an Android app从 Android 应用程序存储/检索高度动态的数据
【发布时间】:2018-03-09 10:52:16
【问题描述】:

我正在尝试开发一个 Android 应用来帮助我测试陶瓷釉料,但在存储数据时遇到了问题。我想要的主要功能是,在一个釉料中,能够修改其配方,但仍保留该配方的旧版本。由于我的很多数据都是重复的(完成、不透明度、射击气氛等),数据库将是存储这些数据的最佳方式。然而,每个釉料可以有任意数量的版本,每个版本中的配方可以有任意数量的成分(通常是 1-10,但最多 20 个)。我想不出一种存储和检索这种“二维”动态数据的方法。我可以为每个釉料制作一个单独的数据库,但我觉得这违背了数据库的目的。任何帮助实现存储这种高度动态数据的方法将不胜感激。谢谢。

【问题讨论】:

  • 我不想存储不必要的数据,但这听起来是解决这个问题的最佳方法。谢谢

标签: android database sqlite


【解决方案1】:

我认为您正在寻找一些相关的表格。

我建议使用釉基表,其中包含基釉、配方/版本釉表。成分/属性表。然后是一个扩展的链接/关联表,用于将成分属性链接到配方,还包含数量。

Glaze 表非常简单,只有釉料的名称和唯一标识符。例如 CREATE TABLE IF NOT EXISTS glazes (_id INTEGER PRIMARY KEY, glazename TEXT)

GlazeVersion 表还是比较简单的,一个唯一的标识符、版本和对它的父/基础釉的引用。例如

CREATE TABLE glazeversions (_id INTEGER PRIMARY KEY, version TEXT, glazebase_ref INTEGER)

Indgredients 表再次简单,一个唯一的 ID 和名称,例如

CREATE TABLE ingredients (_id INTEGER PRIMARY KEY, ingredient TEXT)

Recipes 表将引用釉料版本(因此隐含釉料)、成分参考和成分数量字段,例如

CREATE TABLE IF NOT EXISTS recipes (glazeversion_ref INTEGER, ingredient_ref INTEGER, amount INTEGER, PRIMARY KEY(glazeversion_ref, ingredient_ref))

假设我们有 3 种基础釉料红色、绿色和蓝色。 glazes 表中有 3 个条目(出于说明目的,id 为 1 2 和 3)。

还假设每个版本都有名为 Version001、Version002 和 Version003 的三个版本(为了说明目的,glazeversion 表 id 的 1-9 中有 9 行)。

生成的 glazeversions 表可能是:-

可以编写查询来显示链接/关联/引用,例如

SELECT * FROM glazeversions JOIN glazes WHERE glazebase_ref = glazes._id ORDER BY glazename

结果将是:-

对于成分表,我们假设有 5 种成分,赭石、钙、大气、温度(简称 temp)和持续时间(id 分别为 1-5)。例如

现在它在食谱表上,我们最初假设 1 个釉蓝色版本 Version001 的配方,它有 3 种成分 Atmosphere、Temp 和 Ochre

recipes 表将有 3 行,所有三个都引用 glazeversion Version001 用于 glaze Blue (_id 2),但每行都引用各自的成分(id 的 1、3 和 4)。

我们还将假设另外两种釉料:-

  • Red Version001 有 4 种成分 Duration、Temp、Atmosphere 和 Ocher,所以 4 行都引用了用于 Red (_id 1) 的 glazeversion Version001,各自的成分 id 为 1、3、4 和 5。

  • Green Version003 含有 2 种成分赭石和钙。所以这两行都引用了蓝色的 glazeversion Version003 (_id 9),相应的成分是 id 的 1 和 2。

所以表格看起来像:-

以下查询是将所有内容捆绑在一起的示例:-

SELECT glazename, version, ingredient, amount FROM recipes JOIN ingredients ON ingredient_ref = ingredients._id JOIN glazeversions ON glazeversion_ref = glazeversions._id JOIN glazes ON glazebase_ref = glazes._id

这将导致:-

如果你只想给 Green Version003 上釉,那么你可以添加一个 WHERE 子句,如下所示:-

SELECT glazename, version, ingredient, amount FROM recipes JOIN ingredients ON ingredient_ref = ingredients._id JOIN glazeversions ON glazeversion_ref = glazeversions._id JOIN glazes ON glazebase_ref = glazes._id WHERE glazeversions._id = 9

这将导致:-

【讨论】:

  • 哇,非常感谢老兄。我没想到我的小问题会得到如此广泛的回应。我以前从未使用过数据库,因此实施此解决方案有点超出我的技能水平。但是,这解释了我可能会遇到的许多进一步的问题,我肯定会再次提及这一点。你是救生员。
【解决方案2】:

您应该能够添加具有相同标识符(例如名称)的多个釉料,并为每个釉料添加相关信息和日期。然后,当您选择查看釉料时,您会下拉具有该标识符的釉料的所有信息,并按日期排序。

实际上,您要添加的唯一额外内容是另一个日期、ID 和姓名。否则,该条目包含您原本需要的所有相同数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多