我有Core Data应用程序,我一直在迁移(升级)核心数据模型.每次创建新版本时,我都会为每个版本创建一个映射模型.现在我有16个版本,我有这样的映射模型:1to2.xcmappingmodel 2to3.xcmappingmodel 3to4.xcmappingmodel ...等.最多16
这样可以正常工作,但是当一个用户拥有版本10的数据文件并更新具有版本16的应用程序时会出现问题.有些我认为Core Data会自动从10升级到16,但是出现错误显示"Missing"映射模型".为了确保映射模型在正确的地方,我将它逐个升级到每个版本(10到11,11到12等等),它确实有用......这是我的代码.
我用这段代码指定模型版本:
NSBundle *modelWrapper = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"TaskApp_DataModel" ofType:@"momd"]];
NSString *modelPath = [modelWrapper pathForResource:@"TaskApp_DataModel 16" ofType:@"mom"];
NSLog(@"%@",modelPath);
managedObjectModel = [[NSManagedObjectModel alloc]initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]];
Run Code Online (Sandbox Code Playgroud)
我在这里定义了Migrate Automatic选项:
NSURL *url = [NSURL fileURLWithPath: [applicationSupportDirectory stringByAppendingPathComponent: @"storedata-sql"]];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:url
options:dict
error:&error]){
Run Code Online (Sandbox Code Playgroud)
有谁知道如何升级这个?谢谢.
我正在尝试使用映射模型迁移Core Data存储,但是我收到此错误:"持久存储迁移失败,缺少映射模型."
我的应用找到映射模型,但不使用它,即使哈希匹配.这是迁移调试日志:
2013-04-18 23:23:53.256 MyApp[30934:303] CoreData: annotation: Incompatible version schema for persistent store 'file://localhost/Users/Clemens/Library/Containers/com.my-company.MyApp/Data/Library/Application%20Support/com.my-company.MyApp/MyApp.storedata'. store metadata = {
NSPersistenceFrameworkVersion = 407;
NSStoreModelVersionHashes = {
Project = <71e5190c 4e7bdecf 0fcc5df6 72120586 e6ec3b83 9aecd871 6847c9c1 4e888a06>;
Task = <e7df7dad d3710c84 2cc82543 7ef549e2 a4fa5818 b243b97e 5a734d49 5c1ce19f>;
WorkPeriod = <ed62858b 98bacd8d 70442733 07caae00 f82073d8 dd67fd68 c703778f 4b6c7c37>;
};
NSStoreModelVersionHashesVersion = 3;
NSStoreModelVersionIdentifiers = (
""
);
NSStoreType = XML;
NSStoreUUID = "397108D9-D465-41E4-B5FA-45701DAC5B4D";
} and current model versions = {
Project = <919c7227 …Run Code Online (Sandbox Code Playgroud) 假设我有一个具有3个属性的模型实体.
然后,我为该实体生成NSManagedobject子类,并将自定义方法以及属性添加到此类.
在稍后的一天,我为这个实体添加了一些新属性.
目标
我希望支持的NSManagedobject子类反映这些新属性.
问题
我看到的唯一解决方案是在Xcode中使用{Editor-> Create NSManagedobject Subclass},但这样会覆盖该类.
问题
有没有办法更新实体和支持的NSManagedobject子类而不覆盖类.
我尝试将coreData迁移到新版本,我正在执行以下步骤:
如果您已将应用程序提交到使用早期型号版本的App Store,请在进行任何更改之前添加新的模型版本(选择name.xcdatamodeld,然后选择Editor-> Add model Version).
然后,从Core Data选项卡添加新文件,作为映射模型选择,源模型(提交的应用程序正在使用的模型版本)目标模型(您已完成更改的模型版本)
但我的数据主要是图像和应用程序崩溃,因为它需要大量的内存.所以我想删除旧数据模型及其数据,并在用户更新应用程序时创建空的新模型数据.这该怎么做?
您知道如何在更改实体结构时重置iPhone模拟器上的coredata商店吗?
当我创建的核心数据存储的新版本与我上次在iPhone上运行的版本不同时,是否需要执行类似的过程?如果是的话,请问怎么样?
谢谢
从10.7上标准的基于Xcode文档的应用程序w/CoreData模板开始,我遇到了一些令人沮丧的行为.我确信这是一件很简单的事情.
让我们说在我的NSPersistentDocument子类中,我有这样的东西,连接到窗口中的一个按钮:
- (IBAction)doStuff:(id)sender
{
NSEntityDescription* ent = [[self.managedObjectModel entitiesByName] valueForKey: @"MyEntity"];
NSManagedObject* foo = [[[NSManagedObject alloc] initWithEntity: ent insertIntoManagedObjectContext: self.managedObjectContext] autorelease];
[self.managedObjectContext save: NULL];
}
Run Code Online (Sandbox Code Playgroud)
如果我创建一个新文档并单击该按钮,我将收到以下错误:This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.我得到了这个.我们还没有保存,没有持久的商店.说得通.
现在让我说我把它分成两个动作,连接到不同的按钮,如下:
- (IBAction)doStuff:(id)sender
{
NSEntityDescription* ent = [[self.managedObjectModel entitiesByName] valueForKey: @"MyEntity"];
NSManagedObject* foo = [[[NSManagedObject alloc] initWithEntity: ent insertIntoManagedObjectContext: self.managedObjectContext] autorelease];
}
- (IBAction)doOtherStuff:(id)sender
{
[self.managedObjectContext save: NULL];
}
Run Code Online (Sandbox Code Playgroud)
如果我创建一个新文档并按下第一个按钮,那么在按下该按钮后的某个不确定时间(弄脏文档),自动保存将自动保存并自动保存文档,这将在临时位置创建一个商店.如果我按下第二个按钮,则没有投诉(因为现在有一个商店.)
我需要我的文档能够从一开始就进行managedObjectContext保存.我在后台线程上踢了一些东西,我需要后台上下文的保存操作(和通知),以便将后台线程所做的更改合并到主线程的managedObjectContext中.
我想过尝试强制自动保存,但自动保存过程看起来完全异步,所以我必须跳过箍来禁用任何可能导致managedObjectContext保存的UI交互,直到第一次自动保存操作完成.
我还考虑创建一个内存存储来弥补创建新文档和第一次自动保存之间的差距,但是我不清楚如何将内存存储区中的内容迁移到磁盘存储区并同步删除内存存储区.首次自动保存操作.
任何人对我如何处理这个有任何想法?
当我在下面声明代码语句时,为什么会出现此错误?
使用未声明的标识符'NSMigratePersistentStoresAutomaticallyOption'
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
Run Code Online (Sandbox Code Playgroud)
为了让我能够识别我的NSMigratePersistentStoresAutomaticallyOption常量,我缺少什么?
谢谢,
麦克风
编辑1 虽然我理解对于这个特定场景(和其他类似的场景)我可以单独使用映射编辑器来正确迁移我的存储,以便持久存储中的值不会跳转,但这不是我当前问题的解决方案但只能避免解决问题的根源.我热衷于坚持使用自定义迁移策略,因为这样可以让我在迁移过程中获得很多控制权,特别是对于未来的设置自定义迁移策略对我来说很有意义.这是一个长期的解决方案,而不仅仅是这种情况.
我恳请您尝试帮我解决当前的情况,而不是将我转移到轻量级迁移或建议我避免使用迁移策略.谢谢.
我真的很期待把这个问题整理出来,以及我对解决这个问题我能做些什么的宝贵意见.
我做了什么:
我设置了迁移策略,以便可以将源数据复制到version 1核心模型的目标数据中version 2.
这是迁移政策:
- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error {
// Create the product managed object
NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName]
inManagedObjectContext:[manager destinationContext]];
NSString *productCode = [sInstance valueForKey:@"productCode"];
NSNumber *productPrice = [sInstance valueForKey:@"productPrice"];
[newObject setValue:productCode forKey:@"productCode"];
[newObject setValue:productPrice forKey:@"productPrice"];
//This is the field where the name has changed as well as the type.
[newObject setValue:[NSNumber numberWithBool:YES] forKey:@"productPriceNeedsUpdating"];
// Set up the association between the old source …Run Code Online (Sandbox Code Playgroud) 我有一个完美运行的coreData datamodel文件.由于一些特殊要求,我删除了旧的datamodel文件并创建了具有完全相同实体的另一个datamodel文件.目前在实体没有变化,从以前的数据模型.我已将此作为另一个捆绑包的一部分并从该捆绑包中引用它.
用于创建managedObjectModel的代码
if (managedObjectModel_ != nil) {
return managedObjectModel_;
}
NSBundle *newBundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"dataBundle" withExtension:@"bundle"]];
NSString *modelPath = [newBundle pathForResource:@"DataHouse" ofType:@"momd"];
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return managedObjectModel_;
Run Code Online (Sandbox Code Playgroud)
该应用程序运行良好,直到一段时间突然(随机)我得到一个错误说
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Cannot create an NSPersistentStoreCoordinator with a nil model'
*** First throw call stack:`(0x62e052 0x26a9d0a 0xf6e86d 0x64fd 0x624e 0x381b 0x79c9b 0x65f2d 0x1881e0f 0x1882589 0x186ddfd 0x187c851 0x1827322 …Run Code Online (Sandbox Code Playgroud) 我正在通过核心数据将新对象插入数据库.在插入值之前,有没有办法检查数据库中是否有任何重复?
AccountDetails * newEntry = [NSEntityDescription insertNewObjectForEntityForName:@"AccountDetails" inManagedObjectContext:self.managedObjectContext];
newEntry.acc_date=date;
newEntry.bank_id=bank_id1;
NSError *error;
if (![self.managedObjectContext save:&error]) {
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}
[self.view endEditing:YES];
Run Code Online (Sandbox Code Playgroud)
每次我运行应用程序时,它会再次重新插入值.我想检查是否有任何新的类别,如果没有,那么我将只添加新的类别.
提前致谢..