重命名应用程序后,Core Data 出现问题?
Posted
技术标签:
【中文标题】重命名应用程序后,Core Data 出现问题?【英文标题】:Problem with Core Data, after a rename of the app? 【发布时间】:2011-06-14 18:28:13 【问题描述】:我一直在尝试开发一段 Core Data 代码并且遇到了问题。在我的代码的一个版本中,一切正常,但是在我尝试完善代码之后,我有旧版本,突然它不起作用。我没有改变这个类,这就是为什么我很困惑。
在原始版本中,我得到了可以在这篇文章底部看到的输出,这只有一行,即数据库。在这个版本中,我什么也得不到。
我感觉应用程序和 Core Data 之间的连接可能存在一些问题。我确实通过“项目->重命名”重命名了应用程序,所以也许这就是这个问题的原因?恐怕我不知道去哪里找。
编辑:刚刚看到 xcdatamodel 有旧名称!
EDIT2:是否重命名了旧版本的副本并遇到了同样的问题,所以我猜这个问题的原因是应用程序的重命名。现在我想知道如何将 Core Data 数据库与新名称对齐?
// Define qContext
NSManagedObjectContext *qContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"questions" inManagedObjectContext:qContext];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [qContext executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *info in fetchedObjects)
...
2011-01-24 20:58:38.969 FamQuiz_v2[27431:207] fetchedObjects: ( “(实体:问题;id:0x7088740;数据:)”,...
======================================
=============== 更新==============
我用下面的代码测试了其他参数是否有数据:
//=========PREPARE CORE DATA DB===========//
if (managedObjectContext == nil) managedObjectContext = [(FamQuiz_v2AppDelegate *)
[[UIApplication sharedApplication] delegate] managedObjectContext];
// Define qContext
NSManagedObjectContext *qContext = [self managedObjectContext];
NSLog(@" ");
NSLog(@"qContext: %@", qContext);
NSLog(@" ");
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"questions" inManagedObjectContext:qContext];
NSLog(@" ");
NSLog(@"entity: %@", entity);
NSLog(@" ");
[fetchRequest setEntity:entity];
NSLog(@" ");
NSLog(@"fetchRequest: %@", fetchRequest);
NSLog(@" ");
//>>>>ERROR COMING HERE
NSArray *fetchedObjects = [qContext executeFetchRequest:fetchRequest error:&error];
NSLog(@"fetchedObjects: %@", fetchedObjects);
NSLog(@"====STOP====");
结果如下,表明我确实可以访问数据库,或者?但仍然没有“fetchedObjects”:
2011-01-24 22:27:54.094 FamQuiz_R0_2[29523:207] qContext: 2011-01-24 22:27:54.095 FamQuiz_R0_2[29523:207] 2011-01-24 22:27:54.095 FamQuiz_R0_2[29523:207] 2011-01-24 22:27:54.120 FamQuiz_R0_2[29523:207] 实体:()名称问题,managedObjectClassName NSManagedObject,renamingIdentifier 问题,isAbstract 0,超实体名称(空),属性 idQ = "(), name idQ, isOptional 0, isTransient 0, 实体问题, renamingIdentifier idQ, 验证谓词 (\n), 警告 (\n), versionHashModifier (null), attributeType 200, attributeValueClassName NSNumber, defaultValue (null)" ; qDiff = "(), 名称 qDiff, isOptional 0, isTransient 0, 实体问题, renamingIdentifier qDiff, 验证谓词 (\n), 警告 (\n), versionHashModifier (null), attributeType 200, attributeValueClassName NSNumber, defaultValue (null)" ; qNrAccess = "(), 名称 qNrAccess, isOptional 0, isTransient 0, 实体问题, renamingIdentifier qNrAccess, 验证谓词 (\n), 警告 (\n), versionHashModifier (null), attributeType 200, attributeValueClassName NSNumber, defaultValue (null)" ; qRegDate = "(), 名称 qRegDate, isOptional 0, isTransient 0, 实体问题, renamingIdentifier qRegDate, 验证谓词 (\n), 警告 (\n), versionHashModifier (null), attributeType 900, attributeValueClassName NSDate, defaultValue (null)" ; qRightAnswer = "(), name qRightAnswer, isOptional 0, isTransient 0, 实体问题, renamingIdentifier qRightAnswer, 验证谓词 (\n), 警告 (\n), versionHashModifier (null), attributeType 700, attributeValueClassName NSString, defaultValue (null)" ; qWrongAnswer1 = "(), name qWrongAnswer1, isOptional 0, isTransient 0, 实体问题, renamingIdentifier qWrongAnswer1, 验证谓词 (\n), 警告 (\n), versionHashModifier (null), attributeType 700, attributeValueClassName NSString, defaultValue (null)" ; qWrongAnswer2 = "(), 名称 qWrongAnswer2, isOptional 0, isTransient 0, 实体问题, renamingIdentifier qWrongAnswer2, 验证谓词 (\n), 警告 (\n), versionHashModifier (null), attributeType 700, attributeValueClassName NSString, defaultValue (null)" ; question = "(), name question, isOptional 0, isTransient 0, entity questions, renamingIdentifier question, 验证谓词 (\n), 警告 (\n), versionHashModifier (null), attributeType 700, attributeValueClassName NSString, defaultValue (null)" ; , 子实体 , 用户信息 , versionHashModifier (null) 2011-01-24 22:27:54.121 FamQuiz_R0_2[29523:207] 2011-01-24 22:27:54.123 FamQuiz_R0_2[29523:207] 2011-01-24 22:27:54.123 FamQuiz_R0_2[29523:207] fetchRequest:(实体:问题;谓词:((null));sortDescriptors:((null));类型:NSManagedObjectResultType;) 2011-01-24 22:27:54.124 FamQuiz_R0_2[29523:207] 2011-01-24 22:27:54.125 FamQuiz_R0_2[29523:207] fetchedObjects: ( ) 2011-01-24 22:27:54.126 FamQuiz_R0_2[29523:207] ====停止====
===========UPDATE2==========
这里的代码是:
- (NSManagedObjectModel *)managedObjectModel
if (managedObjectModel_ != nil)
return managedObjectModel_;
NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"FamQuiz_v2" ofType:@"momd"];
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return managedObjectModel_;
=============== UPDATE-3 ==============
我真的对这个问题感到困惑,但确实测试了将应用程序重命名回原来的名称,然后我开始工作了。对我来说,这意味着在某处我找不到的连接,我一直在寻找。
我真的很想了解如何在不丢失与数据库的连接的情况下使用 Core Data 重命名应用程序。
如果有人能对此有所了解,我将不胜感激,因为我需要重命名它。
=============== UPDATE-4 ==============
只是为了更新这个问题,我从来没有成功地让这个东西工作,所以我决定利用“机会”来重写整个应用程序。听起来可能是解决这个问题的一种苛刻的方式,但由于对编程很陌生,它也让我能够清理代码。
我仍然很感兴趣如何解决这个问题。
【问题讨论】:
根据您的日志,managedObjectContext 没有打印任何内容。看看这个方法的 FamQuiz_v2AppDelegate: - (NSManagedObjectModel *)managedObjectModel 或者你在哪里创建你的 NSManagedObjectModel。可能值得将其与您的答案一起发布? 【参考方案1】:在终端中导航到项目目录并实际 cd 进入 .xcodeproj 文件本身。使用 vi 编辑 project.pbxproj 文件,并将所有出现的旧名称更改为更新后的名称。 Xcode 似乎不知道更新所有核心数据引用,但这对我有用。
【讨论】:
【参考方案2】:您没有说您的目标是哪个 Mac OS(Mac OS X 或 ios),但这听起来像是一个 iOS 问题。对于 iOS,Core Data 存储在运行时之间是静态的;如果一个核心数据在之前的运行时已经存在,它会自动使用它,尽管你的代码有任何变化。在再次构建之前尝试清理所有目标。
【讨论】:
是IOS,我做了干净的目标,但仍然有同样的问题。 清除所有目标并从模拟器/设备中删除应用程序。【参考方案3】:我遇到了同样的问题,最后通过创建一个新的数据模型来解决它。
-
删除:MyApplication.xcdatamodeld
新建一个:文件>新建>文件...>核心数据>数据模型
重新添加我的实体
添加回我的实体后,一切都恢复正常了。
【讨论】:
感谢您的回答,自从我写这篇文章以来,我成功地重命名了我的应用程序,有一次我和你一样:-)以上是关于重命名应用程序后,Core Data 出现问题?的主要内容,如果未能解决你的问题,请参考以下文章
重命名项目/工作区后,出现多个“未声明的标识符”错误——但构建良好