iOS:使用单例或不使用单例访问sqlite数据库

时间:2012-09-09 16:47:58

标签: ios database sqlite singleton

我有一个应用程序,其中一个简单的表存储在 common sqlite数据库中。该应用有一个mainview,其他几个观看次数为view1, view2, ....,viewN。从mainview开始,用户可以通过以下代码部分转到view1

screen.modalTransitionStyle=UIModalTransitionStyleCoverVertical;
        [self presentModalViewController:screen animated:YES];

view1中,用户将访问数据库,执行某些操作,然后将view1更新回数据库mainview

[self dismissModalViewControllerAnimated:YES];

用户将对其他视图执行相同的操作,即访问数据库,执行某些操作,更新数据库,然后返回mainview

我的问题是我应该如何组织数据库,使用单例创建一个公共对象来打开mainview的数据库,然后所有视图都将访问数据库,更新它或每个视图将打开数据库,访问它,然后单独更新或有任何其他有效的方法。谢谢

2 个答案:

答案 0 :(得分:2)

当您描述应用程序的结构只是一个线程时 - 使用单例是完全正常的。您只需在应用程序启动时打开数据库一次,并确保在应用程序结束时关闭它,或者甚至在应用程序转到后台时关闭它(当然,您也需要在从背景返回时打开数据库)

顺便说一下,我也尝试打开和关闭每个视图的数据库 - 这也很好。在这种方法中,我有时也会使用“脏”标志,该标志设置为表示数据库在关闭之前需要更新 - 但结果表明性能没有差异。

您也可以使用类变量或在您的app委托中声明它,而不是使用单例变量,这通常是针对核心数据的cotext进行的(其中核心数据中的“上下文”类似于您的数据库中的数据库) )

在您使用的任何方法中,重要的是您的数据库将一直处于一致状态,因为您的应用程序可能会被电话“打断”,例如。

顺便说一下,如果情况允许,我倾向于在iPhone上更频繁地使用核心数据,因为核心数据会处理许多数据库问题 - 只需要明确地保存在一致状态。但这实际上取决于您的数据是更大的数据库还是“某些”持久的对象/属性。

答案 1 :(得分:0)

我建议避免调用SQLite数据库的c级代码 - 尝试使用SQLite的简单包装 - 请参阅https://github.com/JohnGoodstadt/EasySQLite

当你“连接”它时使用单身:

self.db = [DBController sharedDatabaseController:@"MyDB.sqlite"];

然后,任何文件都可以访问共享单例 - 例如

int personCount = [_db  ExecuteScalar:@"SELECT count(*) FROM person" asInt:YES];

DataTable* table = [_db  ExecuteQuery:@"SELECT firstname,lastname FROM person"];

for (NSArray* row in table.rows)
{
   NSString* firstname = row[0];
   NSString* firstname = row[1];
   ...
}