Hi,
I'm developing an atom feed reader for iPhone and I'm trying to
execute a NSFetchRequest with a NSPredicate in a test where the result
should be an array with two objects but instead is emtpy.
There are two entities: Feed (Atom feed) and Entry. In the model Entry
has a relationship with one Feed and in Feed I have defined a selector
that executes an NSFetchedRequest.

I've defined the model in code then this is the definition of Feed description:

+ (NSEntityDescription*)entityDescription {
  NSEntityDescription *feedEntityDescription = [[NSEntityDescription
alloc] init];
  [feedEntityDescription setName:@"Feed"];
  [feedEntityDescription setManagedObjectClassName:@"Feed"];

  NSMutableArray *properties = [NSMutableArray array];

  NSAttributeDescription *title = [[NSAttributeDescription alloc] init];
  [properties addObject:title];
  [title release];
  [title setName:@"title"];
  [title setAttributeType:NSStringAttributeType];
  [title setOptional:NO];

  NSAttributeDescription *feedId = [[NSAttributeDescription alloc] init];
  [properties addObject:feedId];
  [feedId release];
  [feedId setName:@"feedId"];
  [feedId setAttributeType:NSStringAttributeType];
  [feedId setOptional:NO];

  NSAttributeDescription *updateTime = [[NSAttributeDescription alloc] init];
  [properties addObject:updateTime];
  [updateTime release];
  [updateTime setName:@"updateTime"];
  [updateTime setAttributeType:NSStringAttributeType];
  [updateTime setOptional:NO];

  [feedEntityDescription setProperties:properties];
  return feedEntityDescription;
}

and this that of Entry:

+ 
(NSEntityDescription*)entityDescriptionWithFeed:(NSEntityDescription*)feedDescription
{
  NSEntityDescription *entityDescription = [[NSEntityDescription alloc] init];
  [entityDescription setName:@"Entry"];
  [entityDescription setManagedObjectClassName:@"Entry"];

  NSMutableArray *properties = [NSMutableArray array];

  NSAttributeDescription *text = [[NSAttributeDescription alloc] init];
  [properties addObject:text];
  [text release];
  [text setName:@"text"];
  [text setAttributeType:NSStringAttributeType];
  [text setOptional:NO];

  NSAttributeDescription *authorUsername = [[NSAttributeDescription
alloc] init];
  [properties addObject:authorUsername];
  [authorUsername release];
  [authorUsername setName:@"authorUsername"];
  [authorUsername setAttributeType:NSStringAttributeType];
  [authorUsername setOptional:NO];

  NSAttributeDescription *publishTime = [[NSAttributeDescription alloc] init];
  [properties addObject:publishTime];
  [publishTime release];
  [publishTime setName:@"publishTime"];
  [publishTime setAttributeType:NSDateAttributeType];
  [publishTime setOptional:NO];

  NSRelationshipDescription *feed = [[[NSRelationshipDescription
alloc] init] autorelease];
  [properties addObject:feed];
  [feed setName:@"feed"];
  [feed setDestinationEntity:feedDescription];
  [feed setMinCount:1];
  [feed setMaxCount:1];
  [feed setOptional:NO];
  [feed setDeleteRule:NSNullifyDeleteRule];

  [entityDescription setProperties:properties];
  return entityDescription;
}

This is the selector in Feed that should load the entries:

-(NSArray*)sortedEntries {
  NSEntityDescription *entityDescription = [NSEntityDescription
entityForName:@"Entry" inManagedObjectContext:[Persistence
singleton].managedObjectContext];
  NSFetchRequest *request = [[NSFetchRequest alloc] init];
  [request setEntity:entityDescription];
//  NSPredicate *predicate = [NSPredicate
predicateWithFormat:@"feed.feedId like %@", self.feedId];
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"feed ==
self", self];
  [request setPredicate:predicate];
  NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"publishTime" ascending:NO];
  [request setSortDescriptors:[NSArray arrayWithObject:sort]];
  [sort release];

  NSError *error;
  NSArray *result = [[Persistence singleton].managedObjectContext
executeFetchRequest:request error:&error];
  if (!result) {
    NSLog(@"error: %@", [error localizedDescription]);
  }
  return result;
}

This is my failing test:

- (void) testEntityRelationshipWithEntries {
  [Persistence 
initSingletonWithDataStoreName:@"testEntityRelationshipWithEntries"];
  persistence = [Persistence singleton];
  [persistence resetDataStore];

  Feed *feed01 = [Feed feed];
  feed01.title = @"feed01";
  feed01.feedId = @"id01";
  feed01.updateTime = @"update time";
  [persistence commit];
  feed01 = [persistence findFirstOfEntity:@"Feed" predicate:@"title
like[cd] 'feed01'"];
  STAssertEquals(feed01.sortedEntries.count, 0u, @"Intially shouldn't
have entries");
  Entry *entry01 = [self entryWithContent:@"gcastaldi71: Hello world!"
publishTime:[NSDate dateWithTimeIntervalSinceNow:-1000.0]];
  Entry *entry02 = [self entryWithContent:@"gcastaldi71: Hello world
2!" publishTime: [NSDate dateWithTimeIntervalSinceNow:-2000.0]];
  [feed01 addEntry:entry01];
  [feed01 addEntry:entry02];
  [persistence commit];
  NSArray *result = [NSArray arrayWithObjects:entry01, entry02, nil];
  STAssertEqualObjects(feed01.sortedEntries, result, @"Should contains
the just added entries");
}

Note for the test:
- code and test use the same context in the Persistence singleton
- with [persistence commit] is executed a context save

I've verified at the end of my test the db and there are the data correctry:
sqlite> select * from zentry;
1|1|1|1|288677024.234666|gcastaldi71|Hello world!
2|1|1|1|288676024.240294|gcastaldi71|Hello world 2!
sqlite> select * from zfeed;
1|2|1|update time|feed01|id01
sqlite> .schema
CREATE TABLE ZENTRY ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT
INTEGER, ZFEED INTEGER, ZPUBLISHTIME TIMESTAMP, ZAUTHORUSERNAME
VARCHAR, ZTEXT VARCHAR );
CREATE TABLE ZFEED ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT
INTEGER, ZUPDATETIME VARCHAR, ZTITLE VARCHAR, ZFEEDID VARCHAR );
...

Any suggestion?

Thanks.

Jean
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to