0

我有一个 SQLite 数据库,其中调用了一个列,i18n并包含一个 JSON 树,其中包含一些本地化字符串。例如:

{"gr":{"name":"NAME_IN_GR"},"ru":{"name":"NAME_IN_RU"}}

现在我应该在name传递的本地化节点内搜索用户键入的部分字符串。我最初的尝试是使用正则表达式,但我担心它可能会慢一点(用户打字时一切都应该发生,即使操作受到限制)。现在我正在考虑另外两种方法:

  • 使用 FTS 创建虚拟表?这个怎么运作?
  • 更改/制作数据库的副本,其中这些字段在它们自己的列中拆分(即RU,,GR等等IT)。

你有什么建议和一个简单的实现?

4

1 回答 1

1

如果您的 sqlite 实例是在启用JSON1 扩展的情况下编译的,则很容易:

SELECT * FROM yourtable AS t
WHERE EXISTS (SELECT j.id FROM json_each(t.i18n) AS j
              WHERE json_extract(j.value, '$.name') LIKE 'NAME_IN%');

但是,您的第二个想法稍有变化,将所有这些 JSON 子对象提取到表的行中(而不是每种语言一列,随着语言数量的增加,这很快变得笨拙),可能是更好的选择:

CREATE TABLE translations(original TEXT, language TEXT, translated TEXT
                        , PRIMARY KEY(original, language)) WITHOUT ROWID;
INSERT INTO translations VALUES ('name', 'ru', 'название');
-- etc.

可扩展,更易于检查和更新数据,让您只检索相关位,性能更好等。

于 2019-03-01T21:06:21.550 回答