如何在 SQLite 中使用 FTS 和 Monotouch for iOS

Posted

技术标签:

【中文标题】如何在 SQLite 中使用 FTS 和 Monotouch for iOS【英文标题】:How to use FTS in SQLite with Monotouch for iOS 【发布时间】:2011-03-20 23:39:44 【问题描述】:

我正在寻找使用 Monotouch 构建一个 ios 应用程序,该应用程序有一个相当大的 sqlite 数据库,其中充满了文本。我需要对此文本进行快速搜索。

我现在最好的解决方案是 FTS 模块(最好是版本 4)。我读过 iOS 上的默认 sqlite 实例不支持 FTS。如果这是真的,那么推荐使用 Monotouch 构建自定义 sqlite 实例的方法是什么?或者这完全可以做到吗?

我发现这个网站描述了如何使用 xcode 完成此操作,但不清楚我将如何使用 Monotouch 完成此操作。http://longweekendmobile.com/2010/06/16/sqlite-full-text-search-for-iphone-ipadyour-own-sqlite-for-iphone-and-ipad/

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

正如我在上面的评论中提到的,我得到了这个工作,因为 Stack Overflow 确实帮助了我,我想贡献一点回馈社区。免责声明 这来自 .NET 开发人员,他在 iOS/MacOS/XCode/Monotouch 方面是 N00B。 虽然我在 iPad 模拟器上对此进行了测试,但我还没有在实际设备上进行过测试。结束免责声明

这是一个快速编译您自己的 SQLite 版本并将其包含在您的 Monotouch 项目中的快速指南,目的是支持全文搜索。

第 1 步: 下载 SQLite 合并文件。

这包括一个文件中的所有 SQLite。http://www.sqlite.org/download.html

第 2 步:在 Xcode for iOS 中编译 SQLite 源代码。

这里有一个关于如何做到这一点的很好的演练:http://pp.hillrippers.ch/blog/2009/08/08/Static+SQLite+Library+with+Unicode+Support+for+the+iPhone/

我按照步骤 1-5,跳过了 #6,因为我们没有添加额外的标题。

我没有使用演练中使用的编译标志: SQLITE_ENABLE_COLUMN_METADATA SQLITE_ENABLE_FTS4

您可能还想添加其他人。 这些编译标志在 XCode 中添加到项目的“预处理器宏”下的“构建”选项卡中。

编译完成后,您应该拥有“mylibrary.a”。

第 3 步:将此文件包含在您的 MonoDevelop 项目中 将 mylibrary.a 像任何其他文件一样添加到 MonoDevelop 中,右键单击它并确保构建操作为“无”。

在您的项目选项中选择“iPhone Build”。您需要添加额外的 mtouch 参数。添加以下内容

-gcc_flags "-L$ProjectDir -lmylibrary -force_load $ProjectDir/mylibrary.a"

第 4 步:构建 c# 包装器 此时您可能会找到一个很好的包装器,但我很快就推出了自己的包装器。

有关在 C# 中编写 SQLite 包装器的优秀教程,请查看此页面:http://www.switchonthecode.com/tutorials/csharp-tutorial-writing-a-dotnet-wrapper-for-sqlite

因为您的库是项目的一部分,所以您不需要按名称引用库,而是使用“__Internal”关键字。 *注意“__INTERNAL”中有两个下划线 *(不要问我在意识到这一点之前浪费了多少时间)

这是我的一个样本

[DllImport ("__Internal", EntryPoint="sqlite3_open")]  
static extern int sqlite3_open_v2(string filename, out IntPtr db);

显然,要组装一个包装器还有很多工作要做,但那里有很多关于如何做到这一点的信息。一个问题是正确编组从 SQLite 返回的字符串。 (有关编组的更多信息,请参阅http://blog.gebhardtcomputing.com/2007/11/marshal-utf8-strings-in-net.html)

这是一个关于将原生库编译到 MonoDevelop/monotouch 中的快速演练,我希望它对某人有所帮助。

【讨论】:

我使用这些说明构建了静态库,一切正常,除了在设备上进行测试。记得禁用静态库的 Thumb 编译以提高稳定性。禁用它解决了我的应用程序中的 carash 问题。 ***.com/questions/8160726/…【参考方案2】:

你必须做同样的事情,构建你自己的 libsqlite3.a,并修改所有公共导出,这样它就不会与系统加载的 libsqlite 冲突,然后你需要修改你想要的任何库将 sqlite 绑定到 [DllImport ("__Internal")] 而不是 libsqlite。

【讨论】:

所以我几乎做到了这一点并最终让它工作。感谢您指向正确方向的指针。不过,我不必弄乱公共出口,也许是因为我没有在我的项目中引用 System.Data.SQLite?如果时间允许,也许我会添加一个带有详细说明的帖子。

以上是关于如何在 SQLite 中使用 FTS 和 Monotouch for iOS的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 Python 3.7 的 sqlite3 python 模块的 FTS5 扩展?

如何增加 Sqlite FTS4 片段大小

SQLite3 FTS4、MATCH 和 Android

如何停止。在 SQLite FTS4 中被视为分隔符

安卓 SQLITE FTS 版本

如何在 Ubuntu 16.04 上将 FTS5 扩展与带有 Python 3.7 的 sqlite3 python 模块一起使用?