iphone - 预加载的 "Core data"数据库在更新数据库后未显示正确的新数据

标签 iphone ios objective-c database core-data

我的项目中有一个预定义和预加载的数据库,名为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;
}

在任何类(class)中,我想调用我使用的数据库中的数据:

-(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,所以我将拒绝我的二进制文件并上传带有工作/更新数据库的新版本,所以请帮助我

提前致谢

最佳答案

显然,当您有新的更新商店时,商店不会被删除。因此你看到的是旧的值(value)观。

如果您想在有新商店时删除该商店,您可以检查 NSUserDefault 及其版本或告诉您是否需要更新的信息。如果是,请删除持久存储,复制新持久存储并将用户默认设置为新版本。

但是,届时所有用户数据都会丢失。对此有两种解决方案:

1) 您可以有两个持久存储,一个用于“静态”数据,另一个用于用户数据。然而,这可能有点太复杂了。

2) 或者,您可以包含已更改数据的信息并简单地更新数据库(仅当数据库不存在时才复制,即如果是新安装)。这也将保留用户数据。事实上,如果需要更新的数据不多,再次复制整个数据库似乎没有意义。

事实上,如果要复制的数据库的记录少于 10,000 条,则复制核心数据持久存储可能会有问题。您可以在启动时进行快速后台插入,而不是从任何类型的文件中读取。

关于iphone - 预加载的 "Core data"数据库在更新数据库后未显示正确的新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17652212/

相关文章:

ios - 如何在 iOS 中将自定义元数据写入 PNG 图像

iOS 共享扩展未获取图像

iphone - 以编程方式在 iphone sdk 中打开蓝牙?

ios - 找不到“ASIFormDataRequest.h”文件

ios - 搜索栏未显示在导航栏 iOS 11 上

ios - 从应用委托(delegate)调用实例函数

ios - 如何使用 SKAudioNode

iphone - 未在覆盖 View 上绘制线条

iphone - 从 UIDatePicker iOS 检索日期和时间

iphone - Facebook 和 Twitter 与 iPhone 应用程序的集成无法在设备上运行