【发布时间】:2010-12-18 23:08:10
【问题描述】:
在文本中搜索匹配词时,我可以优化 Core Data 查询吗? (这个问题也与 iPhone 上的自定义 SQL 与 Core Data 的智慧有关。)
我正在开发一个新的 (iPhone) 应用程序,它是用于科学数据库的手持参考工具。主界面是一个标准的可搜索表格视图,当用户输入新词时,我希望在输入时做出响应。单词匹配必须是文本中单词的前缀。文本由 100,000 个单词组成。
在我的原型中,我直接编写了 SQL。我创建了一个单独的“单词”表,其中包含主要实体的文本字段中的每个单词。我对单词进行了索引并按照以下方式进行了搜索
SELECT id, * FROM textTable
JOIN (SELECT DISTINCT textTableId FROM words
WHERE word BETWEEN 'foo' AND 'fooz' )
ON id=textTableId
LIMIT 50
这运行得非常快。使用 IN 可能同样有效,即
SELECT * FROM textTable
WHERE id IN (SELECT textTableId FROM words
WHERE word BETWEEN 'foo' AND 'fooz' )
LIMIT 50
LIMIT 至关重要,它可以让我快速显示结果。如果达到限制,我会通知用户显示太多。这很笨拙。
过去几天我一直在思考迁移到 Core Data 的优势,但我担心架构、索引和重要查询的查询缺乏控制。
理论上,textField MATCHES '.*\bfoo.*' 的 NSPredicate 可以正常工作,但我确信它会很慢。这种文本搜索似乎很常见,我想知道通常的攻击是什么?你会像我上面那样创建一个单词实体并使用谓词“word BEGINSWITH 'foo'”吗?它会和我的原型一样快吗? Core Data 会自动创建正确的索引吗?我找不到任何明确的方法来建议持久存储有关索引的信息。
我在我的 iPhone 应用程序中看到了 Core Data 的一些不错的优势。错误和其他内存考虑允许对 tableview 查询进行有效的数据库检索,而无需设置任意限制。对象图管理让我无需编写大量 SQL 即可轻松遍历实体。迁移功能将来会很好。另一方面,在资源有限的环境(iPhone)中,我担心自动生成的数据库会因元数据、不必要的反向关系、低效的属性数据类型等而变得臃肿。
我应该潜入还是谨慎行事?
【问题讨论】:
标签: iphone sql cocoa cocoa-touch core-data