2013-10-21 75 views
0

我正在使用名爲CrumbPoint的核心數據實體,該實體存儲經度和緯度,並指向另一個名爲HRRecord的實體(與之有關係)。 CrumbPoint創建這樣:iOS核心數據更新爲未保存的數據

CrumbPoint *crumbPoint = [NSEntityDescription insertNewObjectForEntityForName:@"CrumbPoint" 
                 inManagedObjectContext:context]; 
crumbPoint.lat = [NSNumber numberWithFloat:lat]; 
crumbPoint.lon = [NSNumber numberWithFloat:lon]; 
crumbPoint.velocity = [NSNumber numberWithFloat:velocity]; 
crumbPoint.date = [NSDate date]; 

// Since this use search query, always refresh from DB 
// The following fetch using NSFetchRequest when the record is available. 
HrRecord * hr = [HRRecord hrRecordWithTitle:title inManagedObjectContext:context]; 
crumbPoint.inRecord = hr; 

HrRecord有一個名爲distance場這正是我需要更新,只要該設備具有位置更新。 (我跟蹤用戶慢跑)。對於每個位置更新,都會創建一個新的CrumbPoint,並且它指向同一個慢跑會話的相同HrRecord。需要計算以前位置和新位置之間的新距離,並且需要更新HrRecord的距離。

但我的問題是,每次我得到HrRecord時間(也許這是一個不好的設計,但我使用NSFetchRequest新位置更新每次查詢的HrRecord

現在當我嘗試更新:

HrRecord * hr = crumbPoint.inRecord; 
float oldDistance = [hr.distance doubleValue]; 
// code to calculate distance here, then, update 
hr.distance = [NSNumber numberWithDouble: newDistanceUpdate]; 

hr.distance將始終是0更新之前,即使更新後,每一次我可以打印出新的價值。我嘗試將save發送到託管對象上下文,但它似乎也不起作用。這是爲什麼?編號: 這裏是要插入的代碼。也許這個錯誤不是關於保存,在保存上下文後,我嘗試用[HrRecord HrRecordWithTitle:title inManagedObjectContext:context]拉出記錄,並更新那一輪的距離。但下一次位置更新進入時,由於某種原因再次爲0。我得檢查更多的代碼。 :/

+(HrRecord *)HrRecordWithTitle: (NSString *)title 
         inManagedObjectContext:(NSManagedObjectContext *)context 
{ 
    HrRecord * record = nil; 
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"HrRecord"]; 
    request.predicate = [NSPredicate predicateWithFormat:@"title = %@", title]; 
    NSSortDescriptor * sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES]; 
    request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

    NSError * error = nil; 
    NSArray * records = [context executeFetchRequest:request error:&error]; 

    if (!records || records.count > 1) { 
     // Nil, or more than one is an error 
    } else if (records.count == 0) { 
     // Create a new record with starting duration of 0 
     record = [NSEntityDescription insertNewObjectForEntityForName:@"HrRecord" inManagedObjectContext:context]; 
     record.title = title; 
     record.duration = @0.0; 
     record.distance = @0.0; 
     record.date = [NSDate date]; 
    } else { // Recrod exists, exactly one 
     record = [records lastObject]; 
     // update duration 
     record.duration = @([record.duration intValue] + 1); 
    } 

    return record; 
} 
+0

你可以發佈一些代碼,你如何實際插入inRecord在適當的'NSManagedObjectContext'?我假設你的數據模型是正確設置的,'HrRecord'類也是從模型中生成的,是對的嗎?我在類方法調用中發現了一個錯字:'HRRecord'而不是'HrRecord'。 –

+0

我不知道你的實現,但試圖執行一個'保存'在獲取數據之前獲取數據的上下文,這將刷新上下文。 – danypata

+0

足夠愚蠢的是,每當我創建新的CrumbPoint時,我都會重置記錄距離。我的錯。 – huggie

回答

0

您使用的是什麼託管對象上下文?你應該使用當前線程中創建的上下文。