Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

接入GRDB库的问题 #91

Closed
bruceFighting opened this issue Jun 7, 2022 · 16 comments
Closed

接入GRDB库的问题 #91

bruceFighting opened this issue Jun 7, 2022 · 16 comments

Comments

@bruceFighting
Copy link

大佬有没有接入GRDB库的例子,按照你这个流程无从下手,从demo下载编译文件也是一大堆错误,有点懵逼(C++小白)

@wangfenjin
Copy link
Owner

不好意思我不太懂iOS,你可以参考 #73

@bruceFighting
Copy link
Author

不好意思我不太懂iOS,你可以参考 #73

WeChat8156b14b3a97ca5acb3e9b10e72eb3d5

这个错误是哪个库的

@wangfenjin
Copy link
Owner

这个库的;你编译流程有问题

这个库里有很多文档你看看吧

@fakerlogic
Copy link

大佬有没有接入GRDB库的例子,按照你这个流程无从下手,从demo下载编译文件也是一大堆错误,有点懵逼(C++小白)

引入.a文件,然后注册组件,最后grdb create fts的时候指定这个组件 t.tokenizer = FTS5TokenizerDescriptor(components: ["simple"]) 就可以

@fakerlogic
Copy link

这个库的;你编译流程有问题

这个库里有很多文档你看看吧
您好:
我在使用sqlite过程中,使用了fts功能,然后加载了fts5 的simple扩展,然后发现那张fts表里面没有数据,column有没有,但是能正常搜索到数据。如果用正常的自带的tokenizer,例如porter, fts那张表里面都是有数据的。不知道我是缺失什么步骤还是什么原因。
感谢!期待您的回复。

@wangfenjin
Copy link
Owner

需要把你建表和插入数据的 SQL 我看下;理论上 simple 和 porter 这些没有区别,如果你只是改了 tokenizer 但是数据不一样,不太可能

@fakerlogic
Copy link

fakerlogic commented Jul 7, 2022

需要把你建表和插入数据的 SQL 我看下;理论上 simple 和 porter 这些没有区别,如果你只是改了 tokenizer 但是数据不一样,不太可能

try db.create(table: "ADDRESSBOOK") { t in
                t.column("id", .integer).primaryKey(onConflict: .replace, autoincrement: true)
                t.column("user_id", .text).unique(onConflict: .replace).indexed().notNull()
                t.column("pid", .text).notNull()
                t.column("label", .text).notNull()
                t.column("pinyin", .text)
                t.column("login_name", .text).notNull()
                t.column("mobile", .text)
                t.column("email", .text)
                t.column("portrait", .text)
                t.column("abbrev", .text)
                t.column("is_resign", .boolean).defaults(to: false)
                t.column("is_master", .boolean).defaults(to: false)
                t.column("remarks", .text)
                t.column("desc", .text)
                t.column("flag", .text).defaults(to: "Y")
            }

//            try db.execute(sql: """
//                CREATE VIRTUAL TABLE ADDRESSBOOK_FTS USING fts5 (
//                    label,
//                    pinyin,
//                    email,
//                    abbrev,
//                    remarks,
//                    desc,
//                    content=ADDRESSBOOK,
//                    content_rowid=id,
//                    tokenize='simple'
//                )
//                """)
            
            try db.create(virtualTable: "ADDRESSBOOK_FTS", using: FTS5()) { t in
                t.column("label")
                t.column("pinyin")
                t.column("email")
                t.column("abbrev")
                t.column("remarks")
                t.column("desc")
//                t.content = "ADDRESSBOOK"
//                t.contentRowID = "ADDRESSBOOK.id"
                t.synchronize(withTable: "ADDRESSBOOK")
                t.tokenizer = FTS5TokenizerDescriptor(components: ["simple"])
            }

我是用的grdb,第二部分注释的是raw sql创建的fts,第三部分是grdb创建的fts,这样写tokenize创建出的fts表没有内容,但是正常搜索

@wangfenjin
Copy link
Owner

你用的是 https://www.sqlite.org/fts5.html#external_content_tables 这个,理论上内容就是不会存在fts 表里面

也不能直接往 fts 表里面插入数据,而要通过上面链接中提到的 trigger 来保持数据同步

@fakerlogic
Copy link

你用的是 https://www.sqlite.org/fts5.html#external_content_tables 这个,理论上内容就是不会存在fts 表里面

也不能直接往 fts 表里面插入数据,而要通过上面链接中提到的 trigger 来保持数据同步

好的,感觉有点奇怪,我用的自带的,fts表里面是可以看到东西的[破涕为笑]

@wangfenjin
Copy link
Owner

看 fts 表建的是哪种类型。你现在的用法是比较推荐的用法,只要记得配置好 trigger 就好

@wangfenjin
Copy link
Owner

如果你的项目也是开源的,做好了可以分享一下,让其他 iOS 的人也能学习

@fakerlogic
Copy link

如果你的项目也是开源的,做好了可以分享一下,让其他 iOS 的人也能学习

公司的项目,接入grdb基本就是上面那些了,加上本工程下的两个静态库和oc文件,就可以了,很方便使用,trigger grdb已经封装好了;
我们用的也是 External Content Tables,正常用分词器,fts表里是能够查看column和同步的内容的,用了simple就不行,但是搜索啥的都是正常

@wangfenjin
Copy link
Owner

那很奇怪,就像名字里面说的 external content table,理论上content在其他表里面,不应该在fts里面也有内容。

fts返回的是rowid,要内容需要关联查询

@wangfenjin
Copy link
Owner

如果 fts 表里也有内容,那么所有数据就相当于存储了两遍,这样是浪费存储空间的。那用external content table也就没意义了

@EnjoyWT
Copy link

EnjoyWT commented Nov 20, 2023

@fakerlogic 可以问下,GRDB.swift 中如何使用这个库的吗,

  1. 如何注册这个库?
  2. 查询时是和普通的 external_content_tables 一样吗

@EnjoyWT
Copy link

EnjoyWT commented Nov 20, 2023

  1. 关于问题1 如何注册这个库的意思是:如何自定义这个分词器时使用这个.a的库。
  2. 查询时,如何使用

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants