2

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

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

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

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

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

4

3 回答 3

0

如果您希望数据从启动到启动持续存在,您将需要将其存储在持久的地方、文件、数据库、iCloud 等。

于 2012-12-15T19:04:54.790 回答
0

您是从捆绑包中打开数据库吗?您无法将更改保存到包中的数据库。您需要将数据库从捆绑包复制到Documents然后打开该数据库。如果您不想在会话之间保存数据库,只需确保始终将数据库从捆绑包复制到Documents应用程序首次启动时。Documents(通常,只有当数据库不存在于 中时,人们才会从 bundle 复制到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

于 2012-12-15T19:07:21.633 回答
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
于 2012-12-15T20:23:43.700 回答