Проблема с Core Data, после переименования приложения? - PullRequest
1 голос
/ 24 января 2011

Я пытался разработать фрагмент кода 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] entity: () имя вопросов, managedObjectClassName NSManagedObject, вопросы переименованияIdentifier, isAbstract 0, имя высшего уровня (ноль), свойства {
idQ = "(), имя 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, attributeValue (null)" ;
qRegDate = "(), имя qRegDate, isOptional 0, isTransient 0, вопросы сущности, renamingIdentifier qRegDate, предикаты проверки (\ n), предупреждения (\ n), versionHashModifier (null), attributeType 900, attributeValueClassName NSDate, defaultValue (null)" ;
qRightAnswer = "(), имя qRightAnswer, isOptional 0, isTransient 0, вопросы сущности, renamingIdentifier qRightAnswer, предикаты проверки (\ n), предупреждения (\ n), versionHashModifier (null), attributeType 700, attributeValueClassName NSString, defaultValue) () ;
qWrongAnswer1 = "(), имя qWrongAnswer1, isOptional 0, isTransient 0, вопросы сущности, renamingIdentifier qWrongAnswer1, предикаты проверки (\ n), предупреждения (\ n), versionHashModifier (null), attributeType 700, attributeValueClassName NSString по умолчанию, default ;
qWrongAnswer2 = "(), имя qWrongAnswer2, isOptional 0, isTransient 0, вопросы сущности, renamingIdentifier qWrongAnswer2, предикаты проверки (\ n), предупреждения (\ n), versionHashModifier (null), attributeType 700, attributeValueClassName NSString, default ;
question = "(), имя вопроса, isOptional 0, isTransient 0, вопросы сущности, вопрос renamingIdentifier, предикаты проверки (\ n), предупреждения (\ n), versionHashModifier (null), attributeType 700, attributeValueClassName NSString, defaultValue (null)" ;
}, субстанции {
}, userInfo {
}, 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: (сущность: вопросы; предикат: ((ноль)); sortDescriptors: ((ноль)); тип: 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] ==== STOP ====

=========== 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_;

}

=============== ОБНОВЛЕНИЕ-3 ==============

Я действительно озадачен этой проблемой, но проверил, чтобы переименовать приложение обратно к исходному имени, и затем я работал. Для меня это означает, что где-то есть связь, которую я не могу найти, и я искал.

Я ДЕЙСТВИТЕЛЬНО хотел бы понять, как переименовать приложение с Core Data, не теряя соединение с базой данных.

Я был бы очень признателен, если бы кто-нибудь смог пролить свет на это, так как мне нужно было бы его переименовать.

=============== ОБНОВЛЕНИЕ-4 ==============

Просто чтобы дать обновление по этой проблеме, мне так и не удалось заставить эту штуку работать, поэтому я решил использовать «возможность» переписать все приложение. Может показаться жестким способом решения этой проблемы, но, будучи очень новым для программирования, это также позволило мне очистить код.

Мне все еще очень интересно, как решить проблему.

Ответы [ 3 ]

1 голос
/ 25 марта 2012

В терминале перейдите в каталог проекта и перейдите к самому файлу .xcodeproj.Отредактируйте файл project.pbxproj с помощью vi и измените все вхождения прежнего имени на обновленное.Кажется, что XCode не знает, чтобы обновить все ссылки на основные данные, но это сработало для меня.

0 голосов
/ 25 августа 2012

У меня была такая же проблема, и я наконец исправил ее, создав новую модель данных.

  1. Удалить: MyApplication.xcdatamodeld
  2. Создайте новую: Файл> Новый> Файл...> Основные данные> Модель данных
  3. Добавить мои объекты обратно

После добавления моих объектов все снова заработало.

0 голосов
/ 25 января 2011

Вы не говорите, на какую Mac OS вы нацеливаетесь (Mac OS X или iOS), но это звучит как проблема iOS. В случае iOS хранилище Core Data является статическим между средами выполнения; если базовые данные уже существуют из предыдущего времени выполнения, они будут автоматически использовать их, несмотря на любые изменения в вашем коде. Попробуйте очистить все цели, прежде чем строить снова.

...