重命名应用程序后,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 出现问题?的主要内容,如果未能解决你的问题,请参考以下文章

重命名项目/工作区后,出现多个“未声明的标识符”错误——但构建良好

重命名 XCode 5.1 项目后出现编译器错误

重命名 Visual Studio 2008 MFC 项目后出现 R6034 运行时错误

重命名元素的 XSLT 问题——更改命名空间

如何为 .NET Core 重命名 ABP 中的列?

在 EF Core 3 中重命名 IdentityRole 表