Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在应用程序打开之前本地存储数据_Objective C_Ios_Ipad - Fatal编程技术网

Objective c 在应用程序打开之前本地存储数据

Objective c 在应用程序打开之前本地存储数据,objective-c,ios,ipad,Objective C,Ios,Ipad,我有一个本地Sqlite数据库,其中包含3个表(高级经理、经理、员工)&所有3个表都是相互关联的。我为数据创建了3个NSObject类(w.r.t表)。现在我有了一个控制器类,我在其中查询这些表并创建这些NSobject类的对象 并更新它。最后,我将这些对象添加到该类中的数组中 现在让我们假设我有3个视图控制器(VC1、VC2、VC3)。因此,当我从VC1到VC2时,我调用data controller类,从data controller类查询并获取阵列,并在我的VC2的3 tableview中

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

现在让我们假设我有3个视图控制器(VC1、VC2、VC3)。因此,当我从VC1到VC2时,我调用data controller类,从data controller类查询并获取阵列,并在我的VC2的3 tableview中显示这些数据。因此,现在我可以添加/删除新的高级经理/经理,并在VC2的不同tableview中显示它

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

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


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

如果您希望数据从一次启动到另一次启动都保持不变,您可以将其存储在一个持久的位置,一个文件、数据库、iCloud等。

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

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

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

指向的数据库,您只需缓存从数据库加载的数组即可。以下是您可以做的大致操作:

@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