0

我有一个应用程序,其中一个简单的表存储在一个常见的sqlite 数据库中。该应用程序有一个mainview和其他几个视图说,view1, view2, ....,viewN。从 a ,用户通过以下代码部分mainview转到:view1

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

view1,用户会访问数据库,做一些事情,然后更新数据库,相当view1回到mainview

[self dismissModalViewControllerAnimated:YES];

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

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

4

2 回答 2

2

当您描述您的应用程序的结构仅为一个线程时 - 使用单例是完全可以的。您只需要在应用程序启动时打开一次数据库,并确保在应用程序结束时关闭它,甚至在应用程序进入后台时关闭它(当然,当您从后台返回时也需要打开数据库)

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

除了使用单例,您还可以使用类变量或在您的应用程序委托中声明它,这通常用于核心数据的上下文(在您的情况下,核心数据中的“上下文”类似于数据库)

无论您使用哪种方法,重要的是您的数据库将始终处于一致状态,因为您的应用程序可能会被例如电话“中断”。

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

于 2012-09-09T17:26:38.107 回答
0

我建议避免调用 SQLite DB 的 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];
   ...
}
于 2012-09-14T17:11:45.683 回答