2014-02-09 63 views
0

我正在將數據保存到核心數據,更新,刪除等。 關於核心數據&保存我沒有任何錯誤。 但是,當我嘗試打開sqlite數據庫文件沒有什麼,沒有更新和保存到核心數據。核心數據 - 數據錯誤

AppDelegate中:在更新的核心數據

- (void)saveContext 
{ 
    NSError *error = nil; 
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext; 
    if (managedObjectContext != nil) { 
     if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { 
      // Replace this implementation with code to handle the error appropriately. 
      // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
    } 
} 

// Returns the managed object context for the application. 
// If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application. 
- (NSManagedObjectContext *)managedObjectContext 
{ 
    if (_managedObjectContext != nil) { 
     return _managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     _managedObjectContext = [[NSManagedObjectContext alloc] init]; 
     [_managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    } 
    return _managedObjectContext; 
} 

// Returns the managed object model for the application. 
// If the model doesn't already exist, it is created from the application's model. 
- (NSManagedObjectModel *)managedObjectModel 
{ 
    if (_managedObjectModel != nil) { 
     return _managedObjectModel; 
    } 
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreDataModel" withExtension:@"momd"]; 
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 
    return _managedObjectModel; 
} 

// Returns the persistent store coordinator for the application. 
// If the coordinator doesn't already exist, it is created and the application's store added to it. 
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    if (_persistentStoreCoordinator != nil) { 
     return _persistentStoreCoordinator; 
    } 

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataModel.sqlite"]; 

    NSError *error = nil; 
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    return _persistentStoreCoordinator; 
} 

#pragma mark - Application's Documents directory 

// Returns the URL to the application's Documents directory. 
- (NSURL *)applicationDocumentsDirectory 
{ 
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
} 

實施例:

- (void)enableORdisableAlertInDatabase:(FMDatabase*)database andOperation:(int)operation andTrapID:(int)trapID 
{ 
    NSLog(@"%s", __PRETTY_FUNCTION__); 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:kCORE_DATA_TRAP_ENTITY inManagedObjectContext:appDelegate.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 
    // Specify criteria for filtering which objects to fetch 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"trapID==%i", trapID]; 
    [fetchRequest setPredicate:predicate]; 

    NSError *error = nil; 
    NSArray *fetchedObjects = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
    if (fetchedObjects == nil) { 
     NSLog(@"%s error: %@", __PRETTY_FUNCTION__, error.localizedDescription); 
    } 
    else { 
     CoreDataTrap *trap = (CoreDataTrap*)fetchedObjects.firstObject; 
     [trap setAlert:[NSNumber numberWithInt:operation]]; 

     [appDelegate.managedObjectContext save:&error]; 

     if (error != nil) { 
      NSLog(@"enableORdisableAlertInDatabase Error: %@", error.localizedDescription); 
     } 
    } 
} 

編輯: 下面是添加或更新對象的函數:

- (void)addOrUpdateTrap:(Traps*)trapObject 
{ 
    int trapID = trapObject.getTrapID; 
    CoreDataTrap *trapEntity = nil; 
    NSError *error = nil; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"CoreDataTrap"]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"trapID == %d", trapID]; 
    [fetchRequest setPredicate:predicate]; 

    NSArray *results = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
    if (results == nil) 
    { 
     // Handle error 
    } 
    else if ([results count] == 0) 
    { 
     // Nothing to update, add new trap 
     // Create a new record (row) 
     trapEntity = [NSEntityDescription insertNewObjectForEntityForName:@"CoreDataTrap" inManagedObjectContext:appDelegate.managedObjectContext]; 
    } 
    else 
    { 
     trapEntity = results[0]; // There should be only one object for the ID. 
    } 


    if (trapEntity != nil) 
    { 
     // Set properties for new or existing object ... 

     // Int 
     [trapEntity setTrapID:[NSNumber numberWithInt:trapObject.getTrapID]]; 
     [trapEntity setType:[NSNumber numberWithInt:trapObject.getTrapType]]; 
     [trapEntity setDist:[NSNumber numberWithInt:trapObject.getTrapDistanceToCar]]; 
     [trapEntity setDist_to_close_point:[NSNumber numberWithInt:trapObject.getTrapDistanceToClosePoint]]; 
     [trapEntity setActive:[NSNumber numberWithInt:trapObject.isActive]]; 
     [trapEntity setAlert:[NSNumber numberWithInt:trapObject.isAlert]]; 
     [trapEntity setAlarmDistance:[NSNumber numberWithInt:trapObject.alarmDistance]]; 
     [trapEntity setRoadNumber:[NSNumber numberWithInt:trapObject.roadNumber]]; 
     [trapEntity setPolys:[NSNumber numberWithInt:trapObject.polygons]]; 
     [trapEntity setEnter_to_area:[NSNumber numberWithInt:trapObject.getTrapEnterToArea]]; 

     // Double 
     [trapEntity setLat:[NSNumber numberWithDouble:trapObject.getTrapLat]]; 
     [trapEntity setLon:[NSNumber numberWithDouble:trapObject.getTrapLon]]; 
     [trapEntity setClose_point_lat:[NSNumber numberWithDouble:trapObject.getTrapClosePointLat]]; 
     [trapEntity setClose_point_lon:[NSNumber numberWithDouble:trapObject.getTrapClosePointLon]]; 

     // NSString 
     [trapEntity setLastTrapAlarm:[NSString stringWithFormat:@"%li", trapObject.getTrapLastAlarm]]; 
     [trapEntity setPoly0:trapObject.getTrapPolygonA]; 
     [trapEntity setPoly1: trapObject.getTrapPolygonB]; 
     [trapEntity setPoly2: trapObject.getTrapPolygonC]; 
     [trapEntity setPolygonAzimut1: trapObject.getTrapPolygonAzimuthA]; 
     [trapEntity setPolygonAzimut2: trapObject.getTrapPolygonAzimuthB]; 
     [trapEntity setPolygonAzimut3: trapObject.getTrapPolygonAzimuthC]; 
     [trapEntity setDesc: trapObject.getTrapDesc]; 
     // etc. for all properties ... 

     error = nil; 
     if (![appDelegate.managedObjectContext save:&error]) 
     { 
      NSLog(@"%s error: %@", __PRETTY_FUNCTION__, error.localizedDescription); 
     } 
    } 
} 

UPDATE - 1: 我記錄的對象,我得到這個(當我將它們添加到核心數據):

"<CoreDataTrap: 0x147c4140> (entity: CoreDataTrap; id: 0x1477d510 <x-coredata://CD85E666-FA17-4D5F-A221-9BC962C7667B/CoreDataTrap/p11> ; data: <fault>)", 
    "<CoreDataTrap: 0x147c4240> (entity: CoreDataTrap; id: 0x1477d520 <x-coredata://CD85E666-FA17-4D5F-A221-9BC962C7667B/CoreDataTrap/p12> ; data: <fault>)", 
    "<CoreDataTrap: 0x145507d0> (entity: CoreDataTrap; id: 0x147cd410 <x-coredata://CD85E666-FA17-4D5F-A221-9BC962C7667B/CoreDataTrap/p13> ; data: <fault>)", 
    "<CoreDataTrap: 0x14550900> (entity: CoreDataTrap; id: 0x147cd420 <x-coredata://CD85E666-FA17-4D5F-A221-9BC962C7667B/CoreDataTrap/p14> ; data: <fault>)", 
    "<CoreDataTrap: 0x14550a30> (entity: CoreDataTrap; id: 0x147cd430 <x-coredata://CD85E666-FA17-4D5F-A221-9BC962C7667B/CoreDataTrap/p15> ; data: <fault>)", 
    "<CoreDataTrap: 0x145401b0> (entity: CoreDataTrap; id: 0x147cd440 <x-coredata://CD85E666-FA17-4D5F-A221-9BC962C7667B/CoreDataTrap/p16> ; data: <fault>)", 
    "<CoreDataTrap: 0x145402b0> (entity: CoreDataTrap; id: 0x147cd450 <x-coredata://CD85E666-FA17-4D5F-A221-9BC962C7667B/CoreDataTrap/p17> ; data: <fault>)", 
    "<CoreDataTrap: 0x14540440> (entity: CoreDataTrap; id: 0x147cd460 <x-coredata://CD85E666-FA17-4D5F-A221-9BC962C7667B/CoreDataTrap/p18> ; data: <fault>)", 
    "<CoreDataTrap: 0x1453e380> (entity: CoreDataTrap; id: 0x147cd470 <x-coredata://CD85E666-FA17-4D5F-A221-9BC962C7667B/CoreDataTrap/p19> ; data: <fault>)", 
    "<CoreDataTrap: 0x1453e480> (entity: CoreDataTrap; id: 0x147cd480 <x-coredata://CD85E666-FA17-4D5F-A221-9BC962C7667B/CoreDataTrap/p20> ; data: <fault>)" 

而且我也記錄他們的價值,它似乎正確的值。

仍然未更新。

+0

你確定你曾經插入對象到對象圖嗎?如果是這樣,請將代碼發佈到創建對象的位置。您正在檢查上下文在嘗試保存之前是否有任何更改,因此如果沒有更改(因此不顯示錯誤),保存將不會執行。 –

+0

我第一次添加代碼時添加了代碼。 –

回答

4

你怎麼知道數據不在SQLite中?你正在看文件還是你沒有看到屏幕上的數據?那裏有兩個不同的潛在問題

如果您正在查看該文件,並且您在iOS 7上,那麼您可能正在查看日記是您混淆的來源。日記模式已在iOS7中打開,並且會導致更新在輔助文件中存在一段時間。這會讓你看到數據不在SQLite文件中,因爲它們還沒有從日誌文件移動到SQLite文件。在這種情況下,一切都很好。

如果您正在查找要顯示在視圖中的數據,那麼您的視圖代碼可能存在錯誤。發佈該視圖代碼將有助於診斷它。

我懷疑你正在查看SQLite文件。糾正我,如果我錯了。

BTW,這一點:

[appDelegate.managedObjectContext save:&error]; 

if (error != nil) { 
    NSLog(@"enableORdisableAlertInDatabase Error: %@", error.localizedDescription); 
} 

是一個糟糕的方式來檢查這個錯誤。 -save:返回一個布爾值,並應當徵詢錯誤:

if ([[appDelegate managedObjectContext] save:&error] == NO) { 
    NSLog(@"Error saving: %@\n%@", [error localizedDescription], [error userInfo]); 
} 
+0

好的,我該如何看待sqlite文件?我的代碼工作,我沒有錯誤,但我仍然想檢查sqlite文件。 –

+0

你可以舉個例子,它有更多的數據。日誌文件最終將被消費到SQLite文件中。另一個選擇是抽取SQLite文件,強制它使用這些文件。 –

+0

如何抽取SQLite文件?當我將我的應用程序的所有文件保存在手機中時,我確實有SQLite文件,但是有關核心數據的文件是空的,有什麼想法? –

0

使用最近的基地或SQLite的專業版本來檢查你的數據庫,你會被罰款。

+0

a)這只是一個意見 - 還有其他應用程序讀取SQLite文件b),更重要的是,問題的原因是日誌記錄,而不是無法讀取文件。 – Abizern