Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.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
Iphone 更新数据库后,预加载的“核心数据”数据库未显示正确的新数据_Iphone_Ios_Objective C_Database_Core Data - Fatal编程技术网

Iphone 更新数据库后,预加载的“核心数据”数据库未显示正确的新数据

Iphone 更新数据库后,预加载的“核心数据”数据库未显示正确的新数据,iphone,ios,objective-c,database,core-data,Iphone,Ios,Objective C,Database,Core Data,我在我的项目中有一个预定义和预加载的数据库,名为database,我将其定义如下: 在AppDelegate中 在任何类中,我都想调用我使用的数据库中的数据: -(NSArray *)sqlCall { AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; NSManagedObjectContext *context = [appDelegate managedObjectContext]; NSE

我在我的项目中有一个预定义和预加载的数据库,名为database,我将其定义如下: 在AppDelegate中

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

-(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提交了我的应用程序,所以我将拒绝我的二进制文件,并上传一个新版本的工作/更新的数据库,所以请帮助我


提前感谢

很明显,当您有一个新的更新商店时,该商店不会被删除。因此,您可以看到旧的值

如果要在有新存储的情况下删除该存储,则可以检查NSUserDefault,该版本或内容会告诉您是否需要更新。如果是,请删除持久存储,复制新存储,并将用户默认设置为新版本

但是,所有的用户数据都将丢失。有两种解决方案:

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

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


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

您的代码中不清楚:1为什么定义writableDBPath,然后在创建存储URL时使用方法applicationDocumentDirectory。您确定指向的是有效的URL吗?2在关闭应用程序之前,您是否使用NSManagedObjectContext-save:方法将数据保存在永久存储中?我唯一需要的是显示更新的数据,我认为设备会兑现数据并仅显示旧记录,忘记我的代码,和我一起思考一种获取更新数据的方法。你的意思是即使在同一个正在运行的会话中,你也看不到更新的数据吗?或者在关闭并重新启动应用程序后,您无法看到更新的数据?如果![fileManager fileExistsAtPath:writableDBPath]{NSString*defaultStorePath=[[NSBundle mainBundle]pathForResource:@数据库类型:@sqlite];您是否已检查更新的数据库是否已复制到doc目录。除非我重置模拟器或从设备中删除应用程序并再次运行代码,否则我无法查看更新的数据!!添加具有相同结构但具有不同名称的新数据库如何,顺便说一句,该数据库没有用户数据这是一个坏主意,因为您变得更加复杂y、 只需在应用程序启动时替换它,然后再分配持久存储。
-(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 ;
}