在iPhone上使用SQLite的数据管理最实用的解决方案是什么?

时间:2009-04-23 23:45:36

标签: iphone database-design sqlite memory-management

我正在开发一个iPhone应用程序,并且是Objective-C和SQLite的新手。话虽如此,我一直在努力设计一个值得存在的实用数据管理解决方案。任何帮助将不胜感激。

这是交易:

我的应用程序与之交互的大部分数据存储在本地SQLite数据库的五个表中。每个表都有一个对应的类,它处理相应表中每个对象/行的初始化,水化,脱水,删除等。每当应用程序加载时,它都会填充五个NSMutableArrays(每种类型的对象一个)。除了主键之外,每个对象实例始终具有可用的ID属性,而不管水合状态如何。在大多数情况下,它是一个UUID,我可以很容易地参考。

在几天前,我只需通过跟踪他们的UUID来访问这些数组中的对象。然后我会根据需要进行水合/脱水。但是,我所拥有的一些对象也维护着自己的数组,这些数组引用了其他对象的UUID。如果我必须通过它的UUID跟踪其中一个“子”对象,它就会变得有点困难。

为了避免必须枚举前面提到的一个数组来查找“父”对象的UUID,然后继续查找“child”的UUID,我添加了一个带有单例实例的DataController来简化过程

我曾希望DataController可以为本地数据库提供单一访问点并使事情变得更容易,但我不确定是这样的。基本上,我所做的是创建多个NSMutableDicationaries。每当初始化DataController时,它都会枚举在Application Delegate中维护的每个前面提到的NSMutableArrays,并在相应的字典中创建一个键/值对,使用给定的对象作为值,并使用UUID作为键。

然后,DataController公开允许客户端使用所需对象的UUID调用以检索对实际对象的引用的过程。只要它们是对象的请求,DataController就会自动保存有问题的对象,然后返回它。我这样做是因为我想控制客户手中的水合作用,以防止被多次引用的物体脱水。

我意识到在大多数情况下我只能制作一个可变的对象副本,然后在必要时替换原始对象,但我想尽可能避免这种情况。因此,我添加了一个额外的字典来监控在任何给定时间使用对象的UUID作为关键字对象的水合,以及表示带有偏移脱水的水合数量的波动计数。这个方法的目标是让DataController在“水合保留计数”达到零时自动脱水任何对象,但这很容易导致严重的内存泄漏,因为它目前依赖于调用者以后再调用减少水合作用的过程保留对象的计数。很明显很多情况下这种情况并不明显,甚至可能都不容易实现,如果只有一个调用对象无法正常完成,我会遇到一个我试图阻止的完全相反的情况。讽刺的,是吗?

无论如何,我在想,如果我按照这种方法继续下去,它就会结束。我很想回到最初的计划,但这样做让我想要畏缩,我确信有更优雅的解决方案在那里漂浮。正如我之前所说,任何建议都将不胜感激。提前谢谢。

3 个答案:

答案 0 :(得分:1)

您是否考虑过通过NSCoder接口实现此功能?不确定它不会比它的价值更麻烦,但如果你想要的是将所有数据提取到内存中的对象图中,并在以后保存回来,那可能是合适的。如果您实际上使用SQL查询来限制内存中数据的数量,那么显然,这不是实现它的方法。

答案 1 :(得分:1)

我也知道(我确信你是)CoreData即将到来,并确保你做出正确的选择。

答案 2 :(得分:0)

毕竟我决定使用核心数据。