所以我创建了一个新版本的数据模型,并使之前的可选字段非可选(给它一个默认值).根据文档,这应该意味着我的迁移符合轻量级自动迁移的条件.
我还添加了允许这样做的选项,当我打开商店时,也按照文档:
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
Run Code Online (Sandbox Code Playgroud)
但是,当我的应用程序启动时,我收到以下错误:
"无法找到或自动推断迁移的映射模型".
有谁知道这里的问题是什么?任何帮助表示赞赏...谢谢!
我的一些beta测试人员遇到了一个奇怪的崩溃,我遇到了麻烦.符号化的崩溃报告表明在init调用时,控制器作为单例进行简单分配时发生了崩溃,但是根据堆栈跟踪,我所看到的代码init实际上并不是崩溃所在的位置.这是相关代码:
1534| + (UA[REDACTED]PlayerController*)sharedInstance
1535| {
1536| @synchronized(self)
1537| {
1538| if (sharedInstance == nil)
1539| sharedInstance = [[UA[REDACTED]PlayerController alloc] init];
1540| }
1541| return sharedInstance;
1542| }
Run Code Online (Sandbox Code Playgroud)
这从未崩溃过,而且代码最近没有随时更改过.这是升高的堆栈跟踪:
Thread 5:
0 libSystem.B.dylib 0x33bd52d4 __kill + 8
1 libSystem.B.dylib 0x33bd52c4 kill + 4
2 libSystem.B.dylib 0x33bd52b6 raise + 10
3 libSystem.B.dylib 0x33be9d26 __abort + 62
4 libSystem.B.dylib 0x33be9d7e abort + 62
5 libSystem.B.dylib 0x33bd7980 __assert_rtn + 152
6 libgcc_s.1.dylib 0x32acab4e _Unwind_SjLj_Resume + 26
7 [REDACTED] 0x00060b64 +[UA[REDACTED]PlayerController sharedInstance] …Run Code Online (Sandbox Code Playgroud) 看起来这应该是直截了当的,但我还没有找到一个很好的例子.我有一个简单的核心数据实体,我想分成两个独立的实体.Apple的文档在很高的层次上提到了它(映射概述),然而,目前还不清楚实际的映射模型应该将关系与新的拆分实体关联回原始模型.
我有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)
有谁知道如何升级这个?谢谢.
我正在尝试进行迁移
我有2个版本的模型
1.xcdatamodel
2.xcdatamodel
Run Code Online (Sandbox Code Playgroud)
我创建了从版本1到2的映射模型
1to2.xcmappingmodel
Run Code Online (Sandbox Code Playgroud)
问题是它无法找到我创建的迁移模型,因此mappingModel始终为nil.有什么我必须做的,以指定它应该使用什么mappingModel?
target = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]];
//target and source are initialized correctly
mappingModel = [NSMappingModel mappingModelFromBundles:nil forSourceModel:source destinationModel:target];
Run Code Online (Sandbox Code Playgroud) iphone core-data objective-c core-data-migration mapping-model
如果我想对给定实体使用自定义迁移策略,我相信我必须在类名前加上产品模块名称,如下图所示:
如何处理多个目标?
我尝试使用以下条目:$(PRODUCT_MODULE_NAME).VisitToVisitPolicy但这似乎不起作用。我仍然有可能复制映射模型,每个目标一个,但这感觉不对。
我知道如果您更改Core Data模型并且之前在旧模型上运行了应用程序,则会出现Persistent Store错误.您将如何处理Core Data模型的更改,以免出现此错误?有没有办法升级旧模型,以便已保存的数据不会丢失?
我最近尝试了很多不同的轻量级迁移.这一切都有效:
1)重命名属性(指定重命名标识符)
2)添加属性
3)向现有实体添加新实体+新属性+反向关系
4)删除与该实体的现有实体+关系
这看起来几乎可以用LM处理任何事情.我错过了什么?在哪些情况下我遇到麻烦并需要一些更复杂的方法?
我目前在我的实体上有一个cardType属性,在旧模型中可以是"Math","Image"或"Text".在新模型中,我将只使用"Math"和"Text"并且还具有hasImage属性,如果旧的cardType是Image(我想要更改为"Text"),我想将其设置为true.
最后,我有一组另一个实体,"卡片",其中一个集合可以与一个套牌相关联,并且在每个实体中,我也将拥有hasImage,如果套牌为"我想要设置为真"图像"之前输入.
这是否可以使用我在两个版本之间创建的映射模型中的值表达式,还是我必须做其他事情?
我找不到任何文件告诉我价值表达中究竟有什么可能(Apple的文档 - http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreDataVersioning/Articles/vmMappingOverview.html% 23 // apple_ref/doc/uid/TP40004735-SW3 - 只有一个非常简单的转换).如果我必须做别的事,会是什么?这看起来很简单,表达式应该能够做到.
在我的项目中,我有以下DomainModel.
public class Login
{
public Guid Id { get; set; }
public Login CreatedBy {get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我使用流畅的配置如下:
modelBuilder.Entity<Login>()
.HasKey(x => x.Id)
.ToTable("Login");
modelBuilder.Entity<Login>()
.HasOptional(x => x.CreatedBy)
.WithMany()
.HasForeignKey(x => x.CreatedBy);
Run Code Online (Sandbox Code Playgroud)
我在存储库中获取所有Logins数据的代码如下:
return from d in Db.Logins.Include("CreatedBy")
select d;
Run Code Online (Sandbox Code Playgroud)
当我执行代码时,我收到以下错误:
外键组件"CreatedBy"不是"Login"类型的声明属性.验证它是否未从模型中明确排除,并且它是有效的原始属性.
任何人都可以在这里暗示我做错了吗?
提前致谢
mapping-model ×10
core-data ×9
iphone ×5
ios ×3
cocoa ×2
crash ×1
migration ×1
objective-c ×1
poco ×1
xcode ×1