2012-02-11 90 views
0

這是簡單的,但我似乎無法找到問題。新元素沒有被添加到數據庫中,我在代碼中沒有收到任何錯誤。iPhone - 添加核心數據問題

這裏是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]; 


} 

附加被稱爲它發送一個消息到用戶拿起從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})" 
) 
+0

你可以發佈你的數據模型嗎?文字很好,如果不是太麻煩的話,也可以是截圖。我假設你有一個fetchedResultsController連接到你的tableViewController - 是這種情況?如果沒有,我們可能需要從那裏開始:-) – 2012-02-11 17:18:08

+0

使用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; – user1034642 2012-02-11 17:41:50

+0

你怎麼知道你沒有儲蓄?僅僅因爲新的項目沒有出現在表格中?你用'sqlite3'命令行工具或其他SQLite數據庫瀏覽器檢查過嗎? – Mundi 2012-02-11 19:27:37

回答

0

如果你沒有任何 美眉 崩潰(而不是隻在這種情況下),首先我要替換的字符串:喜歡的東西

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

但那裏有什麼?
另外,我覺得有點迷惑frase:

Im using a NSFetchRequest not a fetchedResults controller.

創建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]); 
} 

(在此之後,你可以從fetchedResultsController所有對象)

OR,如果你不希望使用控制器,直接取到數組:

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

如果他沒有任何錯誤,這不會產生任何影響... – Mundi 2012-02-11 19:24:04

+0

不記得是否所有保存到上下文的錯誤都會導致應用程序與異常報告混合在一起。如果是這樣,那麼你是對的。 – makaron 2012-02-11 23:13:54

+0

這是獲取跟蹤方法 - - (NSMutableArray *)fetchTracks { NSMutableArray * result; result = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; return [result autorelease]; } – user1034642 2012-02-12 00:40:45