2012-01-06 2 views
0

Это мой первый случай, когда вы пытаетесь выполнить основные данные и испытываете некоторые проблемы с работой. У меня есть синтаксический анализатор xml в моем приложении, который я пытаюсь добавить всю информацию в основные данные, но продолжаю сбой при запуске. У меня есть основные данные, настроенные с 1 Entity как «Темы». В этом объекте у меня есть 15 атрибутов. Ниже приведен автоматический файл xcode, созданный для ManagedObject после создания моей .CoreData.Вставить управляемый объект в CoreData из xml

Themes.h 

    #import <Foundation/Foundation.h> 
    #import <CoreData/CoreData.h> 


    @interface Themes : NSManagedObject 

    @property (nonatomic, retain) NSString * themeName; 
    @property (nonatomic, retain) NSString * themeArtist; 
    @property (nonatomic, retain) NSString * themeImage; 
    @property (nonatomic, retain) NSString * themeDescription; 
    @property (nonatomic, retain) NSString * twitterName; 
    @property (nonatomic, retain) NSString * themePrice; 
    @property (nonatomic, retain) NSString * screenshots; 
    @property (nonatomic, retain) NSString * cydiaLink; 
    @property (nonatomic, retain) NSString * themeVersion; 
    @property (nonatomic, retain) NSString * deciption; 
    @property (nonatomic, retain) NSString * repo; 
    @property (nonatomic, retain) NSString * hd; 
    @property (nonatomic, retain) NSString * sd; 
    @property (nonatomic, retain) NSString * ipad; 

    @end 



#import "Themes.h" 


@implementation Themes 

@dynamic themeName; 
@dynamic themeArtist; 
@dynamic themeImage; 
@dynamic themeDescription; 
@dynamic twitterName; 
@dynamic themePrice; 
@dynamic screenshots; 
@dynamic cydiaLink; 
@dynamic themeVersion; 
@dynamic deciption; 
@dynamic repo; 
@dynamic hd; 
@dynamic sd; 
@dynamic ipad; 

-(void)setThemeName:(NSString *)themeName{ 

self.themeName = [themeName copy]; 


} 



@end 

Вот мои XML-файлы Parser, в которых должно произойти все волшебство. В целом все прекрасно работает с моим анализатором это только тогда, когда я

"themesObjects = (темы *) [NSEntityDescription
insertNewObjectForEntityForName: themesObjects.themeName"
inManagedObjectContext: managedObjectContext];»

приложение будет врезаться Я предполагаю, потому что я не правильно вставить объект в CoreData.

#import <Foundation/Foundation.h> 
#import "ThemeParseObject.h" 
#import "Themes.h" 


@class ThemeParseObject; 

@interface ThemeXMLParser : NSObject <NSXMLParserDelegate> { 

NSMutableData *recivedData; 
NSMutableArray *themes; 
NSMutableString *currentNodeContent; 
NSXMLParser  *parser; 

Themes *themesObjects; 
NSManagedObjectContext *managedObjectContext; 
NSMutableArray *themeArray; 

ThemeParseObject *currentTheme; 

} 
@property (readonly, retain) NSMutableArray *themes; 
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 
@property (nonatomic, retain) NSMutableArray *themeArray; 


-(id) loadXMLByURL:(NSString *)urlString; 

@end 


#import "ThemeXMLParser.h" 


@implementation ThemeXMLParser 

@synthesize themes; 
@synthesize managedObjectContext; 
@synthesize themeArray; 



-(id) loadXMLByURL:(NSString *)urlString{ 


themesObjects = [[Themes alloc]init]; 
managedObjectContext = [[NSManagedObjectContext alloc] init]; 
themes   = [[NSMutableArray alloc] init]; 
NSURL *url  = [NSURL URLWithString:urlString]; 
NSData *data = [[NSData alloc] initWithContentsOfURL:url]; 
parser   = [[NSXMLParser alloc] initWithData:data]; 
parser.delegate = self; 
[parser parse]; 
return self;  

} 

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname 
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
attributes:(NSDictionary *)attributeDict 
{ 


if ([elementname isEqualToString:@"theme"]) 
{ 
    currentTheme = [ThemeParseObject alloc]; 
} 
} 


- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName  
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 



NSManagedObjectContext *context = [self managedObjectContext]; 
NSManagedObject *ObjectsToInsert = [NSEntityDescription 
           insertNewObjectForEntityForName:@"Themes" 
           inManagedObjectContext:context];  

if ([elementName isEqualToString:@"name"]) { 

    currentTheme.themeNameString = currentNodeContent; 

    themesObjects.themeName = currentTheme.themeNameString; 

    [ObjectsToInsert setValue:themesObjects.themeName forKey:@"themeName"]; 


} 
if ([elementName isEqualToString:@"creator"]) { 

    currentTheme.themeCreator = currentNodeContent; 
    // themesObjects = (Themes *)[NSEntityDescription 
insertNewObjectForEntityForName:@"themeArtist" 
inManagedObjectContext:managedObjectContext]; 


}  
if ([elementName isEqualToString:@"price"]) { 

    currentTheme.themePrice = currentNodeContent; 
    //themesObjects = (Themes *)[NSEntityDescription 
insertNewObjectForEntityForName:@"themePrice" 
inManagedObjectContext:managedObjectContext]; 


}  
if ([elementName isEqualToString:@"twitter"]) { 

    currentTheme.creatorTwitterName = currentNodeContent; 
    //themesObjects = (Themes *)[NSEntityDescription 
insertNewObjectForEntityForName:@"twitterName" 
inManagedObjectContext:managedObjectContext]; 


} 
if ([elementName isEqualToString:@"link"]) { 

    currentTheme.cydiaLink = currentNodeContent; 
    //themesObjects = (Themes *)[NSEntityDescription 
insertNewObjectForEntityForName:@"cydiaLink" 
inManagedObjectContext:managedObjectContext]; 

} 
if ([elementName isEqualToString:@"deciption"]) { 

    currentTheme.deciption = currentNodeContent; 
    //themesObjects = (Themes *)[NSEntityDescription 
insertNewObjectForEntityForName:@"deciption" 
inManagedObjectContext:managedObjectContext]; 

}  

if ([elementName isEqualToString:@"screenshots"]) { 

    currentTheme.screenShots = currentNodeContent; 

}   
if ([elementName isEqualToString:@"promo"]) { 

    currentTheme.tblViewImage = currentNodeContent; 
} 

if ([elementName isEqualToString:@"description"]) { 

    currentTheme.themeDescription = currentNodeContent; 

}  

if ([elementName isEqualToString:@"version"]) { 

    currentTheme.themeVersion = currentNodeContent; 

    // NSLog(@"version: %@", currentNodeContent);   
}  

if ([elementName isEqualToString:@"repo"]) { 

    currentTheme.themeRepo = currentNodeContent; 

    // NSLog(@"repo: %@", currentNodeContent); 

}  

if ([elementName isEqualToString:@"HD"]) { 

    currentTheme.HD = currentNodeContent; 

    // NSLog(@"HD: %@", currentNodeContent); 

}  

if ([elementName isEqualToString:@"SD"]) { 

    currentTheme.SD = currentNodeContent; 

    // NSLog(@"SD: %@", currentNodeContent); 

} 

if ([elementName isEqualToString:@"iPad"]) { 

    currentTheme.ipad = currentNodeContent; 

    //NSLog(@"iPad: %@", currentNodeContent); 

}  

if ([elementName isEqualToString:@"iPhoneScreenshots"]) { 

    currentTheme.fullScreenShots = currentNodeContent; 
    // themesObjects = (Themes *)[NSEntityDescription 
insertNewObjectForEntityForName:@"screenshots" 
inManagedObjectContext:managedObjectContext];   
    // NSLog(@"fullScreenShots: %@", currentNodeContent); 

    }  

    if ([elementName isEqualToString:@"theme"]) 
{ 

    [themes addObject:currentTheme]; 
    [currentTheme release]; 
    currentTheme = nil; 
    [currentNodeContent release]; 
    currentNodeContent = nil; 

} 


} 

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
currentNodeContent = (NSMutableString *) [string  
stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
} 

Это то, что получает регистрируется, когда приложение падает

2012-01-06 08:02:18.619 ThemeCatcher[2667:207] CoreData: error: Failed to call 
designated initializer on NSManagedObject class 'Themes' 
2012-01-06 08:02:19.000 ThemeCatcher[2667:207] -[Themes themeName]: unrecognized 
selector sent to instance 0x87072d0 

Если у кого есть какие-либо предложения или идеи, где я могу идти отсюда, это было бы потрясающе. Я прошу прощения, если это похоже на много кода, на который можно смотреть, но я чувствовал, что это нескричало, чтобы дать другим понять, что действительно происходит внутри кода ... Спасибо, я ценю любую помощь, предоставленную очень!

ответ

1
themesObjects = [[Themes alloc]init]; 
managedObjectContext = [[NSManagedObjectContext alloc] init]; 

Я вижу две вещи неправильно в этих двух строках. Во-первых, вы не используете назначенный инициализатор для NSManagedObject в своем инициализаторе тем. Я знаю это по двум причинам: а) это именно то, о чем говорится в сообщении об ошибке; b) Инициализатор не может знать, какой контекст использовать, потому что вы не создали контекст в этой точке. designated initializer for NSManagedObjectContext является:

-initWithEntity:insertIntoManagedObjectContext: 

Однако, это обычная практика, чтобы использовать метод + insertNewObjectForEntityForName:inManagedObjectContext: удобства NSEntityDescription для создания и добавления новых объектов в контекст вместо этого. В любом случае вам нужно использовать один из них.

Вторая проблема заключается в том, что у вас нет контекста управляемого объекта при создании объекта Themes, и похоже, что вы неправильно настроили контекст при его создании. После его создания следует настроить постоянный координатор хранилища для контекста.

Update: Третья проблема заключается в том, что когда вы пишете:

themesObjects = (Themes *)[NSEntityDescription insertNewObjectForEntityForName:themesObjects.themeName" inManagedObjectContext:managedObjectContext]; 

вам необходимо убедиться, что модель имеет объект, который соответствует значению themeObjects.themeName. Было бы необычно использовать данные, которые вы получаете из файла XML, чтобы определить название темы, потому что ошибка в XML-файле вызовет ошибку, а также потому, что она сильно связывает структуру XML с вашей базой данных. Убедитесь, что вы не путаете концепцию XML-объекта с Объект основных данных - это две разные вещи. Объекты Core Data - это разные типы объектов в вашей модели; например, у вас, вероятно, есть тема для Темы.

+0

Я понял, что ничего не делаю с моим управляемым объектом, поэтому считаю, что я исправил это и обновил вопрос. Я благодарю вас за ответ и, похоже, все еще имею ту же проблему, хотя теперь я инициализирую объект и вставляю строку с помощью [ObjectsToInsert setValue: themesObjects.themeName forKey: @ "themeName"]; – FreeAppl3

+0

Хорошо ... добавлено обновление, которое может помочь. – Caleb

Смежные вопросы