【问题标题】:Problem with Core Data, after a rename of the app?重命名应用程序后,Core Data 出现问题?
【发布时间】: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。可能值得将其与您的答案一起发布?

标签: iphone objective-c ios core-data


【解决方案1】:

在终端中导航到项目目录并实际 cd 进入 .xcodeproj 文件本身。使用 vi 编辑 project.pbxproj 文件,并将所有出现的旧名称更改为更新后的名称。 Xcode 似乎不知道更新所有核心数据引用,但这对我有用。

【讨论】:

    【解决方案2】:

    您没有说您的目标是哪个 Mac OS(Mac OS X 或 iOS),但这听起来像是一个 iOS 问题。对于 iOS,Core Data 存储在运行时之间是静态的;如果一个核心数据在之前的运行时已经存在,它会自动使用它,尽管你的代码有任何变化。在再次构建之前尝试清理所有目标。

    【讨论】:

    • 是IOS,我做了干净的目标,但仍然有同样的问题。
    • 清除所有目标并从模拟器/设备中删除应用程序。
    【解决方案3】:

    我遇到了同样的问题,最后通过创建一个新的数据模型来解决它。

    1. 删除:MyApplication.xcdatamodeld
    2. 新建一个:文件>新建>文件...>核心数据>数据模型
    3. 重新添加我的实体

    添加回我的实体后,一切都恢复正常了。

    【讨论】:

    • 感谢您的回答,自从我写这篇文章以来,我成功地重命名了我的应用程序,有一次我和你一样:-)
    猜你喜欢
    • 1970-01-01
    • 2021-10-07
    • 2017-06-10
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 2015-07-02
    相关资源
    最近更新 更多