使用SQLite和JSON1的子查询

时间:2018-02-19 16:07:56

标签: json sqlite android-sqlite sqlite-cipher

我刚刚发现了SQLite的JSON1,并发现它将是我在Android应用程序中处理的许多问题的完美答案(我使用的是SQLCipher,它提供了支持JSON1的SQLite版本)。 SQLite documentation for JSON1非常好,但不包括运行子查询等问题 - 这在任何情况下都超出了我的SQL能力。

这是我的测试用例

我首先创建表

CREATE TABLE users(name TEXT,phone TEXT)

然后我添加两行

INSERT INTO users (name,phone) VALUES('Joe Bloggs','{"mobile":
"123456789","land":"987654321"}');

INSERT INTO users (name,phone) VALUES('Jane Bloggs','{"mobile":
"234567890","land":"098765432"}');

然后我可以查询返回,比如说只返回手机号码

 SELECT json_extract(users.phone, '$.mobile') FROM users;

将返回结果[“123456789”,“234567890”]

但是假设我想获取移动电话号码为234567890的用户的固定电话号码和名称。我如何使用可用的json_*原语函数编写子查询,以便简单地返回结果[ “Jane Bloggs”,“234567890”]?

1 个答案:

答案 0 :(得分:2)

我正在考虑关闭这个问题但是觉得离开它并且答案对其他人更有用。 SQLite JSON1文档实际上解释了如何做这些事情虽然解释不是很明显。在这个实例中要发出的SQL将是

import tkinter as tk
import tkinter.ttk as ttk
import tkinter.font as tkFont

class App(ttk.Frame):

    def __init__(self, parent):
        ttk.Frame.__init__(self, parent)
        self.parent = parent
        fontFamilies = tkFont.families()
        print('tkFont.families() = ', fontFamilies)

        testfont = 'URW Gothic L' #change string to the font you want to use
        for font in fontFamilies:
            if testfont == font:
                print('\n{} in tkFont.families()'.format(testfont))
                break

        self._defaultFont=tkFont.Font(family=testfont, size='11',
                                      weight='normal')        
        self.setFont()


    def setFont(self):
        """Customise Font styles""" 
    self.Font = self._defaultFont.copy()
    self.FontBold = self._defaultFont.copy()
    self.FontBold.config(weight='bold')
    print('\n_defaultFont.configure = ', self._defaultFont.configure())
    print('_defaultFont.actual    = ', self._defaultFont.actual())
    print('Font.configure         = ', self.Font.configure())
    print('Font.actual            = ', self.Font.actual())
    print('FontBold.configure     = ', self.FontBold.configure())
    print('FontBold.actual        = ', self.FontBold.actual())


if __name__ == '__main__':
    root = tk.Tk()
    root.title('Test')
    root.geometry('200x100')
    app = App(root)
    app.pack(expand=1, fill='both')
    root.mainloop()