我有一个应用程序,其中一个简单的表存储在 common sqlite数据库中。该应用有一个mainview
,其他几个观看次数为view1, view2, ....,viewN
。从mainview
开始,用户可以通过以下代码部分转到view1
:
screen.modalTransitionStyle=UIModalTransitionStyleCoverVertical;
[self presentModalViewController:screen animated:YES];
在view1
中,用户将访问数据库,执行某些操作,然后将view1
更新回数据库mainview
:
[self dismissModalViewControllerAnimated:YES];
用户将对其他视图执行相同的操作,即访问数据库,执行某些操作,更新数据库,然后返回mainview
。
我的问题是我应该如何组织数据库,使用单例创建一个公共对象来打开mainview
的数据库,然后所有视图都将访问数据库,更新它或每个视图将打开数据库,访问它,然后单独更新或有任何其他有效的方法。谢谢
答案 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];
...
}