1

我正在寻找使用 Monotouch 构建一个 iOS 应用程序,该应用程序具有相当大的 sqlite db 充满文本。我需要对此文本进行快速搜索。

我现在最好的解决方案是 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/

任何帮助深表感谢!

4

2 回答 2

5

正如我在上面的评论中提到的那样,我得到了这个工作,因为 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 中,右键单击它并确保构建操作为“Nothing”。

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

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

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

有关在 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 中的快速演练,我希望它对某人有所帮助。

于 2011-04-09T03:39:57.423 回答
0

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

于 2011-03-21T14:45:09.543 回答