有没有办法在iOS中存储任意键/值,我知道我可以创建在SQLite中存储JSON键值的列,但我想要更高效的东西,所以我只能从查询记录中获取所需的值.
如果我可以在没有外部数据库(如LevelDB)的情况下执行此操作,但如果您认为这可能是唯一的方法,请告诉我您更喜欢哪一个.
更新:
数据将包含从服务器检索的文章(长html文章,标题和日期以及其他未定义的数据)和其他元数据,每次用户打开应用程序时都会检索并显示它.(这就是为什么NSUserDefaults不适用于这个用例)
我写了一个处理50MB文本的应用程序(大约10,000篇HTML文章).他们被索引编入索引articleID
.我在这个应用程序中使用过LevelDB,原始Sqlite,带有FMDB的Sqlite,CoreData和NSUserDefaults.
这是我学到的东西:
LevelDB为您提供任意键/值访问模式,如果您按顺序读取它们,则读取速度非常快.但是如果你需要随机读取一个键(不使用它的迭代器),它比Sqlite慢得多.
如果您正确使用原始Sqlite,则可以快速进行随机读取.(使用索引,覆盖索引等)但是您将失去读写任意键/值的能力.
FMDB为您提供了一个很好的Objective-C API,但是在Objective C和C之间转换数据时浪费了50%的CPU时间(NSString < - > char*)(它仍然比Core Data快4倍+)
我个人认为核心数据很糟糕.所以我不建议任何人使用它.对不起,我不想回忆起使用CoreData时的那些痛苦.
NSUserDefaults最适合用户设置,仅适用于用户设置,绝对不是长篇文章的解决方案.
我使用原始Sqlite和Google Protocol Buffer.
协议缓冲区的编码和解码速度非常快.它还使您能够通过修改.proto文件来添加新字段,无需更改DB方案.您可以存储多个相关的密钥在一个单一的原型,比方说articleMetaData.proto
含有title
,author
并且publishDate
,如果一段时间后,你需要添加modifyDate
你只需将其添加到原文件,并存储二进制SQLite中在同一列.