<Events >
<Event timeStamp = "01/16/2010" />
<Event timeStamp = "02/01/2010" />
<Event timeStamp = "03/05/2010" />
</ Events >
//Event.h
#import <CoreData / CoreData.h>
@interface Event : NSManagedObject
{
}
@property ( nonatomic, retain ) NSDate * timeStamp;
@end
//Event.m
#import "Event.h"
@implementation Event
dynamic timeStamp;
@end
//EventsRepositoryDelegate.h
#import <UIKit / UIKit.h>
@protocol EventsRepositoryDelegate
@property ( nonatomic, retain ) NSFetchedResultsController * fetchedResultsController;
@end
//EventsRepository.m
#import <Foundation / Foundation.h>
#import "EventsRepositoryDelegate.h"
#import "Event.h"
@interface EventsRepository : NSObject {
id <EventsRepositoryDelegate> delegate;
}
@property ( assign ) id <EventsRepositoryDelegate> delegate;
- ( void ) saveEventWithTimeStamp : ( NSDate * ) timeStamp;
@end
//EventsRepository.m
#import "EventsRepository.h"
@implementation EventsRepository
@synthesize delegate;
- ( void ) saveEventWithTimeStamp : ( NSDate * ) timeStamp {
NSManagedObjectContext * context = [ delegate.fetchedResultsController managedObjectContext ] ;
Event * event = [ NSEntityDescription insertNewObjectForEntityForName : @ "Event" inManagedObjectContext : context ] ;
event.timeStamp = timeStamp;
NSError * error = nil ;
if ( ! [ context save : & error ] ) {
NSLog ( @ "Unresolved error% @,% @" , error, [ error userInfo ] ) ;
abort ( ) ;
}
[ event release ] ;
}
@end
//EventsXmlParser.h
#import <Foundation / Foundation.h>
#import "EventsXmlParserDelegate.h"
#import "Event.h"
@interface EventsXmlParser : NSObject <NSXMLParserDelegate> {
id <EventsXmlParserDelegate> delegate;
}
@property ( assign ) id <EventsXmlParserDelegate> delegate;
- ( void ) saveEventWithTimeStamp : ( NSDate * ) timeStamp;
@end
//EventsXmlParser.m
#import "EventsXmlParser.h"
@implementation EventsXmlParser
@synthesize delegate;
- ( void ) parser : ( NSXMLParser * ) parser
didStartElement : ( NSString * ) elementName
namespaceURI : ( NSString * ) namespaceURI
qualifiedName : ( NSString * ) qualifiedName
attributes : ( NSDictionary * ) attributeDict {
if ( [ elementName isEqualToString : @ "Event" ] ) {
NSDateFormatter * dateFormatter = [ [ NSDateFormatter alloc ] init ] ;
[ dateFormatter setDateFormat : @ "dd.MM.yyyy" ] ;
NSDate * timeStamp = [ [ [ NSDate alloc ] init ] autorelease ] ;
timeStamp = [ dateFormatter dateFromString : ( NSString * ) [ attributeDict objectForKey : @ "timeStamp" ] ] ;
[ delegate.eventsRepository saveEventWithTimeStamp : timeStamp ] ;
[ dateFormatter release ] ;
}
}
- ( void ) dealloc {
[ super dealloc ] ;
}
@end
//EventsXmlParserDelegate.h
#import <UIKit / UIKit.h>
#import "EventsRepository.h"
@protocol EventsXmlParserDelegate
@property ( nonatomic, retain ) EventsRepository * eventsRepository;
@end
// full header file RootViewController.h
#import <UIKit / UIKit.h>
#import <CoreData / CoreData.h>
#import "EventsXmlParserDelegate.h"
#import "EventsRepositoryDelegate.h"
#import "EventsXmlParser.h"
#import "EventsRepository.h"
@interface RootViewController : UITableViewController <NSFetchedResultsControllerDelegate, EventsXmlParserDelegate, EventsRepositoryDelegate> {
@private
NSFetchedResultsController * fetchedResultsController_;
NSManagedObjectContext * managedObjectContext_;
EventsRepository * eventsRepository_;
}
@property ( nonatomic, retain ) NSManagedObjectContext * managedObjectContext;
@property ( nonatomic, retain ) NSFetchedResultsController * fetchedResultsController;
@property ( nonatomic, retain ) EventsRepository * eventsRepository;
@end
// and what you need to remember to add in RootViewContorller.m for property eventsRepository
...
@synthesize eventsRepository = eventsRepository_;
...
- ( EventsRepository * ) eventsRepository {
if ( eventsRepository_ ! = nil ) {
return eventsRepository_;
}
eventsRepository_ = [ [ EventsRepository alloc ] init ] ;
eventsRepository_.delegate = self;
return eventsRepository_;
}
...
- ( void ) dealloc {
[ eventsRepository_ release ] ;
[ fetchedResultsController_ release ] ;
[ managedObjectContext_ release ] ;
[ super dealloc ] ;
}
- ( void ) populateDataBase {
NSLog ( @ "populate" ) ;
NSURL * url = [ NSURL fileURLWithPath : [ [ NSBundle mainBundle ] pathForResource : @ "Events" ofType : @ "xml" ] ] ;
NSXMLParser * xmlParser = [ [ NSXMLParser alloc ] initWithContentsOfURL : url ] ;
EventsXmlParser * eventsXmlParser = [ EventsXmlParser new ] ;
[ eventsXmlParser setDelegate : self ] ;
[ xmlParser setDelegate : eventsXmlParser ] ;
BOOL success = [ xmlParser parse ] ;
if ( success )
NSLog ( @ "Data Base has been populated" ) ;
else
NSLog ( @ "Error: Data Base hasn't been populated" ) ;
[ eventsXmlParser release ] ;
[ xmlParser release ] ;
}
NSURL * storeURL = [ NSURL fileURLWithPath : [ [ self applicationDocumentsDirectory ] stringByAppendingPathComponent : @ "CoreDataExample.sqlite" ] ] ;
NSString * storePath = [ [ self applicationDocumentsDirectory ] stringByAppendingPathComponent : @ "CoreDataExample.sqlite" ] ;
NSFileManager * fileManager = [ NSFileManager defaultManager ] ;
if ( ! [ fileManager fileExistsAtPath : storePath ] ) {
NSString * defaultStorePath = [ [ NSBundle mainBundle ] pathForResource : @ "CoreDataExample" ofType : @ "sqlite" ] ;
if ( defaultStorePath ) {
[ fileManager copyItemAtPath : defaultStorePath toPath : storePath error : NULL ] ;
}
}
NSURL * storeURL = [ NSURL fileURLWithPath : storePath ] ;
Source: https://habr.com/ru/post/108229/
All Articles