iPhone - проблема с основными данными при добавлении - PullRequest
0 голосов
/ 11 февраля 2012

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

Вот метод добавления

- (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];

    }


}

}

Я использую 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;

UPDATE

Хорошо, поэтому я добавил строку для печати массива в выражении 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})"
)

1 Ответ

0 голосов
/ 11 февраля 2012

Если у вас не было сбоев crush (и не только в этом случае), сначала я бы заменил строку:

[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 в этом случае даст вам некоторую информацию. В любом случае, спасение человека - довольно опасная операция, и вы не должны оставлять ее без дополнительной, хотя бы небольшой, проверки.

Удачи!

EDIT:
Не могли бы вы опубликовать, как на самом деле вы делаете выборку объектов из базы данных. Насколько я понимаю, вы выполняете это здесь:

tracks = [self fetchTracks];

а что там?
Кроме того, я нахожу немного запутанным фраза:

Я использую NSFetchRequest, а не контроллер fetchedResults.

Вы создаете объект NSFetchRequest для того, чтобы описать , что вы хотите получить (извлечь) из базы данных. Вы делаете это правильно, но я не вижу в коде, где вы на самом деле используете этот запрос тогда ...
Для извлечения используется NSFetchedResultsController . Вы настраиваете что-л. как:

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...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...