2014-10-03 55 views
-1

假设我正在构建一个为特定网站获取RSS提要的应用程序。用户可能会要求纽约时报的文章,然后完成并要求从波士顿环球报的文章。将核心数据用于临时存储的最佳方式是什么?

它是有意义的存储在我的核心数据(纠正我,如果我错了,因为我想能够轻松搜索,并与NSFetchedResultsController我可以轻松呈现数据。

但是,我该如何处理这样的事实,即我不想永远保持身体?在上面的例子中,一旦用户请求波士顿环球报,我不再需要将数据存储在纽约时报上,而且当NSFetchedResultsController要求显示内容并且它仍在商店中时,实际上很烦人。 。

+0

Doug,没有违法,但这不是一个很好的使用Core Data的方法。我不会建立一个商店,以便在几次点击后摆脱它。你说用户必须能够搜索,但不想永远保持。这是否意味着每次用户退出应用程序时都会删除数据?请澄清。 – carlodurso 2014-10-03 19:58:49

+0

@carlodurso没有冒犯,如果这是我想学习的情况!它不需要从应用程序的启动到启动,实际上它不应该,从删除它或操作系统只是清理它。可以在发布时重新加载Feed以获取新项目。我很想听听你的建议。 – 2014-10-03 20:40:35

+1

太好了。教学和学习,这是我的目标:-)我会发布一个答案,我想与你分享几件事情。 – carlodurso 2014-10-03 20:47:40

回答

1

我在使用Core Data进行临时存储时看到的一个问题是清理。核心数据不提供API来批量删除行,例如指定NSPredicate,强制您在删除行时使用循环。

尽管如此,使用NSFetchedResultsController的便利性可能非常值得删除时的麻烦:this answer提供了一种以编程方式删除所有数据的解决方案(其他答案表明删除底层文件可能无法在最新版本的iOS中使用) 。

如果您不介意编写一些SQL查询,而不使用核心数据层,针对“原始”SQLite运行,可能会提供更清晰的替代方案,因为您可以使用非常简单的SQL DML命令将删除卸载到后端存储上。

+0

“针对”原始“SQLite运行可能会提供一个更清洁的替代方案”。在核心数据的模式或默认值更改之前,这不能正确处理通知Core Data底层存储已更改。直接修改Core Data NSSQLiteStoreType存储的SQLite数据是非常危险的。 – quellish 2014-10-06 00:38:46

+0

@quellish我认为你完全误解了我的观点:我的意思是直接使用SQLite,完全去掉核心数据层。 – dasblinkenlight 2014-10-06 00:55:06

+0

你应该更新你的答案,以明确。最初的问题是关于核心数据,现在你的答案的文本没有清楚地表明你正在提出一种放弃核心数据方法的方法。 – quellish 2014-10-06 00:56:47

0

如果您不想保存到磁盘,则应该使用内存中存储选项NSInMemoryStore而不是Sqlite作为您的NSPersistentStoreCoordinator。

+0

加载新饲料时怎么样?旧的Feed信息仍将保留在内存中。 – 2014-10-03 20:41:31

+0

只需删除商店并创建一个新商店。棘手的部分是确保没有人使用旧商店。 – 2014-10-03 21:30:25

+0

如果您拆卸并重新创建核心数据堆栈,旧信息将会消失。 – jrturton 2014-10-03 21:37:20

0

在Web开发中使用新词我不会为每个用户会话创建一个SQL表,然后在他/她退出该网站时将其删除。这对于CPU而言会很昂贵。用这些术语来思考核心数据。将其用于持久数据。

你的应用程序有些方面不是很清楚,但总的来说我宁愿使用NSDictionary来存储数据。然后,只要触发搜索,就将这些数据移动到NSArray,该NSArray与NSPredicate很好地协作。

现在,如果您的情况是特定的,并且您认为Core Data会将性能或UX值添加到您的应用中,那么您可以在核心数据中插入对象,并在applicationDidEnterBackgroundapplicationWillTerminate中删除它们。

[NSEntityDescription insertNewObjectForEntityForName:@"feed" inManagedObjectContext:context]; 
[context deleteObject:aManagedObject]; 

这是我的2美分。

相关问题