iPhone-添加时的核心数据问题

iPhone-添加时的核心数据问题,iphone,core-data,Iphone,Core Data,这很简单,但我似乎找不到问题所在。新元素没有添加到数据库中,代码中也没有任何错误 这里是add方法 - (void) addPressed:(NSNotification *) message { // Insert a new record in the database Track *track2 = [NSEntityDescription insertNewObjectForEntityForName: @"Track" inManagedObjectContext: managedOb

这很简单,但我似乎找不到问题所在。新元素没有添加到数据库中,代码中也没有任何错误

这里是add方法

- (void) addPressed:(NSNotification *) message
{
// Insert a new record in the database
Track *track2 = [NSEntityDescription insertNewObjectForEntityForName: @"Track" inManagedObjectContext: managedObjectContext];

[managedObjectContext save: &error];

tracks = [self fetchTracks];


// Insert a new item in the table's data source
[tracks insertObject: track2  atIndex: 0];

// Insert a new row in the table
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection: 0]; 

addTrack.track = [tracks objectAtIndex: indexPath.row]; 

NSLog(@"here");

[[NSNotificationCenter defaultCenter] postNotificationName:@"choosePressed" object:self];


}
调用add后,它会向另一个视图控制器发送一条消息,用户在该控制器中从mpmediapicker中选择一首歌曲,然后点击选择此方法的保存按钮

- (void) finishedEditing 
{


if(start.text.length == 0)
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Warning" message: @"You must fill out all fields" delegate: self cancelButtonTitle: @"OK" otherButtonTitles: nil];
    alert.tag = 1;
    [alert show];
    [alert release];
}
else if(duration.text.length == 0) 
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Warning" message: @"You must fill out all fields" delegate: self cancelButtonTitle: @"OK" otherButtonTitles: nil];
    alert.tag = 1;
    [alert show];
    [alert release];
}
else if(name.text.length == 0) 
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Warning" message: @"You must fill out all fields" delegate: self cancelButtonTitle: @"OK" otherButtonTitles: nil];
    alert.tag = 1;
    [alert show];
    [alert release];
}
else if(songLabel.text.length == 0) 
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Warning" message: @"You must select a song" delegate: self cancelButtonTitle: @"OK" otherButtonTitles: nil];
    alert.tag = 1;
    [alert show];
    [alert release];
}    
else 
{
    if (repeat) 
    {
        track.title = NULL;
        track.name = NULL;
        repeat = NO;

    }
    else
    {
        songLabel.text = @"";
        artistLabel.text = @"";  
        [self viewWillDisappear: YES];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
        track.name = name.text; 
        track.duration = duration.text;
        track.startloc = start.text;
        track.title = [song valueForProperty:MPMediaItemPropertyTitle];
        NSManagedObjectContext *context = track.managedObjectContext; 
        NSError *error = nil; 
        [context save: &error];

        [[NSNotificationCenter defaultCenter] postNotificationName:@"myTraxsTab" object:self];

    }


}

}

Im使用NSFetchRequest而不是fetchedResults控制器。这是密码

request = [[NSFetchRequest alloc] init]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey: @"name" ascending: YES]; 
sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
request.sortDescriptors = sortDescriptors; 
[sortDescriptor release]; 
error = nil; 
entity = [NSEntityDescription entityForName: @"Track" inManagedObjectContext: managedObjectContext]; 
request.entity = entity;
更新

好的,我在这里的else语句中添加了一行来打印数组

else
    {
        songLabel.text = @"";
        artistLabel.text = @"";  
        [self viewWillDisappear: YES];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
        track.name = name.text; 
        track.duration = duration.text;
        track.startloc = start.text;
        track.title = [song valueForProperty:MPMediaItemPropertyTitle];
        NSManagedObjectContext *context = track.managedObjectContext; 
        NSError *error = nil; 
        [context save: &error];

        NSLog(@"array: %@", tracks);

        [[NSNotificationCenter defaultCenter] postNotificationName:@"myTraxsTab" object:self];

    }
这就是它正在打印的内容。我不知道我错过了什么。这让我发疯。我显然在名称、持续时间和开始标签中添加了值

array: (
"<Track: 0x136d80> (entity: Track; id: 0x13a120 <x-coredata://9D789618-64C1-40BF-9F15-BA6A3EA715D3/Track/p7> ; data: {\n    duration = nil;\n    name = nil;\n    startloc = nil;\n    title = nil;\n})"
)
数组:(
“(实体:Track;id:0x13a120;数据:{\n duration=nil;\n name=nil;\n startoc=nil;\n title=nil;\n})”
)
如果您没有任何挤压崩溃(不仅在本例中),首先我会替换字符串:

[managedObjectContext save: &error];
比如:

// Save the managed object context.
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
    NSLog(@"Failed to save object to managed object context: %@, %@", error, [error userInfo]);
}
也许(我认为最有可能的是),在这种情况下,NSlog将为您提供一些信息。 无论如何,伙计,储蓄是一个相当危险的操作,你不应该在没有额外的,至少是小额支票的情况下离开它

祝你好运

编辑:
你能告诉我你是如何从数据库中提取对象的吗。据我所知,您在这里执行:

tracks = [self fetchTracks];
但是有什么呢?
此外,我发现有点让人困惑:


Im使用NSFetchRequest而不是fetchedResults控制器

创建NSFetchRequest对象是为了描述要从数据库中检索(获取)的内容。您做得很好,但我在代码中没有看到您实际使用此请求的地方…
为了检索NSFetchedResultsController,正在使用。 你把它设置成smth。比如:

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] 
                                                         initWithFetchRequest:request 
                                                         managedObjectContext:self.managedObjectContext
                                                         sectionNameKeyPath:nil cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
if (![self.fetchedResultsController performFetch:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
然后,要执行实际的获取,您需要执行smth。比如:

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] 
                                                         initWithFetchRequest:request 
                                                         managedObjectContext:self.managedObjectContext
                                                         sectionNameKeyPath:nil cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
if (![self.fetchedResultsController performFetch:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
(在此之后,您可以从fetchedResultsController获取所有对象)

,如果您不想使用控制器,请直接获取到阵列:

NSError *error = nil;
NSArray *array = [managedObjectContext executeFetchRequest:request error:&error];
if (array == nil)
{
    // Deal with error...
}

你能发布你的数据模型吗?文本很好,如果不太麻烦的话,也可以使用屏幕截图。我假设您有一个连接到tableViewController的fetchedResultsController-是这样吗?如果没有,我们可能需要从这里开始:-)我使用的是NSFetchRequest,而不是fetchedResults控制器。这是密码。请求=[[NSFetchRequest alloc]init];NSSortDescriptor*sortDescriptor=[[NSSortDescriptor alloc]initWithKey:@“name”升序:是];sortDescriptors=[[NSArray alloc]initWithObjects:sortDescriptor,nil];request.sortDescriptors=sortDescriptors;[sortDescriptor发布];误差=零;实体=[NSEntityDescription entityForName:@“Track”inManagedObjectContext:managedObjectContext];request.entity=实体;你怎么知道你没有储蓄?仅仅因为新项目没有出现在表中?您是否使用
sqlite3
命令行工具或其他SQLite数据库浏览器进行了检查?不记得是否所有保存到上下文的错误都会导致应用程序与异常报告一起崩溃。如果是这样,那么您是对的。这是fetch tracks方法--(NSMutableArray*)fetchTracks{NSMutableArray*结果;结果=[[managedObjectContext executeFetchRequest:request error:&error]mutableCopy];返回[result autorelease];}