我的项目中有一个名为Database
的预定义和预加载数据库,我将其定义如下:
在AppDelegate
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (__persistentStoreCoordinator != nil) {
return __persistentStoreCoordinator;
}
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"Database.sqlite"];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Database.sqlite"]; //este es el que sirve!!! CREE ESTE
// NSLog(@"store URL %@", storeURL);
// Put down default db if it doesn't already exist
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:writableDBPath]) {
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Database" ofType:@"sqlite"];
if (defaultStorePath) {
[fileManager copyItemAtPath:defaultStorePath toPath:writableDBPath error:NULL];
}
}
NSError *error = nil;
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return __persistentStoreCoordinator;
}
在任何课程中,我都想从我使用的数据库中调用数据:
-(NSArray *)sqlCall {
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"MotherWeekly" inManagedObjectContext:context];
NSFetchRequest *request = [[ NSFetchRequest alloc] init];
[request setFetchLimit:1];
[request setEntity:entityDesc];
NSString *a =[NSString stringWithFormat:@"%@==%d",@"id",pageNumber];
NSPredicate *pred = [NSPredicate predicateWithFormat:a];
[request setPredicate:pred];
NSError *error;
NSArray *objects = [context executeFetchRequest:request
error:&error];
[request release];
return objects ;
}
问题是:当我更新预装数据库中的字段并在我的模拟器或iPhone上运行时,数据似乎是旧的而不是更新的数据。
PS:在我发现这个问题之前我已经将我的应用程序提交到AppStore,所以我要拒绝我的二进制文件并上传一个带有工作/更新数据库的新版本,所以请帮助我
提前致谢
答案 0 :(得分:1)
显然,如果您有新的更新商店,则不会删除商店。因此,您会看到旧值。
如果您想要删除商店,如果有新商店,您可以检查NSUserDefault
是否有版本或某些内容,告诉您是否需要更新。如果是,请删除持久性存储,复制新存储并将用户默认设置为新版本。
然而,所有用户数据都会丢失。有两种解决方案:
1)您可以拥有两个持久性存储,一个用于“静态”数据,另一个用于用户数据。但是,这可能有点过于复杂。
2)或者,您可以包含已更改数据的信息,只需更新数据库(仅在不存在时进行复制,即如果是新安装)。这也将保留用户数据。实际上,如果需要更新的数据不多,那么再次复制整个数据库似乎没有意义。
实际上,如果要复制的数据库少于(例如)10.000条记录,则复制核心数据持久性存储可能会有问题。您可以在启动时快速插入背景,而不是从任何类型的文件中读取。