如何在SQLite中使用带有Monotouch for iOS的FTS

时间:2011-03-20 23:39:44

标签: sqlite xamarin.ios full-text-search fts3

我正在寻找使用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/

非常感谢任何帮助!

2 个答案:

答案 0 :(得分: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步:构建c#wrapper
你可能会找到一个好的包装器来包含在这一点,但我很快就推出了自己的包装。

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

答案 1 :(得分:0)

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