在本地存储数据,直到应用程序打开

时间:2012-12-15 18:55:40

标签: objective-c ios ipad

我有一个本地Sqlite DB,其中包含3个表(高级经理,经理,员工)&所有3个表都是相互关联的。我为数据创建了3个NSObject类(w.r.t表)。现在我有一个Controller类,我在这里查询这些表&创建那些NSobject类的对象 并更新它。最后,我将这些对象添加到该类中的数组中。

现在假设我有3个视图控制器(VC1,VC2,VC3)。所以当我从VC1到VC2时,我调用数据控制器类,make query&从数据控制器类&获取数组并在我的VC2中的3 tableview中显示这些数据。所以现在我可以添加/删除一个新的高级经理/经理&在VC2中的不同tableview中显示它。

所以我的问题是当我再次从VC2回到VC1&再次回到VC2我看不到添加/删除的行。因为在我的viewDidLoad中,我再次尝试从Data控制器类中获取数组,因此它将再次显示数据库中存在的数据。

注意我有一个限制,我不想将这些添加/删除操作数据写入任何数据库。因此,每次重新启动应用程序时,我都必须显示DB中存在的默认数据。

任何人都可以帮我解决这个问题吗?因此,从打开到关闭应用程序,我可以维护这些数据。

3 个答案:

答案 0 :(得分:0)

如果您希望数据从启动到启动持续存在,您将无法将其存储在耐用的地方,文件,数据库,iCloud等。

答案 1 :(得分:0)

您是否从捆绑包中打开数据库?您无法将更改保存到捆绑包中的数据库。您需要将数据库从捆绑包复制到Documents,然后打开该数据库。如果您不想在会话之间保存数据库,只需确保在应用程序首次启动时始终将数据库从捆绑包复制到Documents。 (通常,只有当Documents中的数据库不存在时,人们才会从包中复制到Documents,但听起来您想要始终复制它。)

要复制数据库,您可以执行以下操作:

NSString *databaseName = kDatabaseName; // obviously, replace this with your database filename

NSString *documentsFolder      = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *databaseDocumentPath = [documentsFolder stringByAppendingPathComponent:databaseName];
NSString *databaseBundlePath   = [[NSBundle mainBundle] pathForResource:databaseName ofType:@""];

NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;

if (![fileManager copyItemAtPath:databaseBundlePath
                          toPath:databaseDocumentPath
                           error:&error])
    NSLog(@"Unable to copy database from '%@' to '%@': error = %@", databaseBundlePath, databaseDocumentPath, error);

执行此操作后,您可以打开databaseDocumentPath指向的数据库。

答案 2 :(得分:0)

您只需要从数据库加载后缓存数组。这大致是你可以做的:

@implementation DataController

static NSMutableArray *managers;

//Note: not thread-safe
- (NSMutableArray*) managers {
    if (!managers)
      managers = loadDefaultManagers();//queries default data from sqlite db and loads array

    return managers;
}

- (void) addManager:(NSDictionary*) manager {
  [managers addObject:manager];
}
...

@end