2011-06-14 99 views
2

我有一个成功迁移的模型,但需要15-20秒。 (很显然,这不得不作为后台任务在启动时完成,否则我的应用将超时。)CoreData模型版本迁移

20秒的延迟,无论它在哪里完成,都是不好的用户体验。我一直在寻找的核心数据迁移的SQL输出看看那里的主要瓶颈是我发现了这个有趣的说法

UPDATE ZSIZE SET Z_ENT = (CASE WHEN Z_ENT = 9 THEN 10 ELSE Z_ENT END) WHERE Z_ENT IN (9) 

这种说法似乎是服用5秒(并有他人在我的数据库中的其他表)。

当然,因为IN (9)在声明的结尾,它不需要在表中每行运行一个case语句?

为什么CoreData不是只运行这个语句呢?

UPDATE ZSIZE SET Z_ENT=10 WHERE Z_ENT = 9 

奖励积分,任何其他提示/如何优化coredata迁移的提示,将不胜感激!

+0

我不想试图优化框架所做的迁移,它不一定是最快的,但它是正确的。您可以编写自己的迁移代码,只需将数据从一个商店复制到另一个商店,并在那里进行性能优化。 – ImHuntingWabbits 2011-06-17 07:31:34

+0

我绝对不想自己做!我只是感兴趣,为什么它似乎做无意义的东西:) – deanWombourne 2011-06-17 09:03:56

+0

哈哈肯定,它看起来像根本原因是你改变了实体类型(无论是通过切换父实体或实体名称)为您的实体之一。 case语句实际上是在表中更新该值的最正确方法,尤其是在多个子实体受到影响并且必须重新设置的情况下。然而,我不确定SQLite会如何处理这个声明,并且这里还没有足够的信息来判断这是否是您迁移的真正问题。 – ImHuntingWabbits 2011-06-17 15:03:28

回答

0

也许我对“Example or explanation of Core Data Migration with multiple passes?”这个问题的回答很有用。这是关于通过多次传递进行迁移才能向用户展示进步的一种方式。

+0

抱怨抱怨抱怨希望避免自己写任何代码。 。 。 :) – deanWombourne 2011-06-14 15:59:30

+0

@deanWombourne对不起,最好我可以在这种情况下做。希望会有一个工作较少的答案;) – 2011-06-14 16:02:27

+0

我有一种感觉,你是对的;我可能需要用UI欺骗(一个进度条!)来修复它,而不是使它更快: – deanWombourne 2011-06-14 16:11:25