2015-07-12 3 views
-1

Я пытаюсь удалить объект из coredata, который соответствует Test2. Я попытался это:удалить объект из Coredata (получить сообщение об ошибке)

let context = self.fetchedResultsController.managedObjectContext 
    let fetchRequest = NSFetchRequest(entityName:"Person") 
    fetchRequest.predicate = NSPredicate(format: "name = Test2") 
    var error : NSError? 
    let results = managedObjectContext!.executeFetchRequest(fetchRequest, error:&error) 

    context.deleteObject(results.firstObject as NSManagedObject) 

Я получаю сообщение об ошибке в этой строке кода: context.deleteObject(results.firstObject as NSManagedObject). В нем говорится: Cannot invoke 'deleteObject' with an argument list of type '(NSManagedObject)'. Кто-нибудь знает, как я могу решить эту ошибку?

UPDATE:

2015-07-12 20:43:09.601 Note[4222:138125] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to generate SQL for predicate (name == Test2) (problem on RHS)' 
*** First throw call stack: 
(
0 CoreFoundation      0x000000010ebd6c65 __exceptionPreprocess + 165 
1 libobjc.A.dylib      0x0000000110741bb7 objc_exception_throw + 45 
2 CoreData       0x000000010e7f0bbc -[NSSQLGenerator newSQLStatementForRequest:ignoreInheritance:countOnly:nestingLevel:] + 1724 
3 CoreData       0x000000010e7dcdc4 -[NSSQLAdapter _statementForFetchRequest:ignoreInheritance:countOnly:nestingLevel:] + 244 
4 CoreData       0x000000010e6f4e0c -[NSSQLAdapter _newSelectStatementWithFetchRequest:ignoreInheritance:] + 316 
5 CoreData       0x000000010e6f4a86 -[NSSQLCore newRowsForFetchPlan:] + 118 
6 CoreData       0x000000010e6f433c -[NSSQLCore objectsForFetchRequest:inContext:] + 524 
7 CoreData       0x000000010e6f3dbb -[NSSQLCore executeRequest:withContext:error:] + 299 
8 CoreData       0x000000010e7cea6c __65-[NSPersistentStoreCoordinator executeRequest:withContext:error:]_block_invoke + 3356 
9 CoreData       0x000000010e7d7c30 gutsOfBlockToNSPersistentStoreCoordinatorPerform + 192 
10 libdispatch.dylib     0x0000000111e65614 _dispatch_client_callout + 8 
11 libdispatch.dylib     0x0000000111e4b002 _dispatch_barrier_sync_f_invoke + 365 
12 CoreData       0x000000010e7c9245 _perform + 197 
13 CoreData       0x000000010e6f3a58 -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 504 
14 CoreData       0x000000010e6f22ca -[NSManagedObjectContext executeFetchRequest:error:] + 586 
15 Note        0x000000010e4efb72 _TFC5Note14ViewController19deleteSelectedTasksfS0_FT_T_ + 738 
16 Note        0x000000010e4ef843 _TFC5Note14ViewController7delTaskfS0_FT_T_ + 51 
17 Note        0x000000010e4ef882 _TToFC5Note14ViewController7delTaskfS0_FT_T_ + 34 
18 Foundation       0x000000010f011744 __NSFireTimer + 83 
19 CoreFoundation      0x000000010eb3e174 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20 
20 CoreFoundation      0x000000010eb3dd35 __CFRunLoopDoTimer + 1045 
21 CoreFoundation      0x000000010eaffd3d __CFRunLoopRun + 1901 
22 CoreFoundation      0x000000010eaff366 CFRunLoopRunSpecific + 470 
23 GraphicsServices     0x000000011128ca3e GSEventRunModal + 161 
24 UIKit        0x000000010f475900 UIApplicationMain + 1282 
25 Note        0x000000010e5146c7 main + 135 
26 libdyld.dylib      0x0000000111e99145 start + 1 
27 ???         0x0000000000000001 0x0 + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

ответ

0

Проблема, кажется, в вашем определении предиката. Пожалуйста, попробуйте:

fetchRequest.predicate = NSPredicate(format: "name = 'Test2'") 

или

fetchRequest.predicate = NSPredicate(format: "%K = %@", "name", "Test2") 

Если вы хотите добавить переменную.

fetchRequest.predicate = NSPredicate(format: "%K = %@", "name", variable) 
+0

Да, первый, наконец, работал. Большое спасибо за вашу помощь! – paro

+0

@paro, пожалуйста, примите ответ и повысьте – agy

+0

Я отметил это как правильно. Не могли бы вы рассказать мне, что я должен написать, если я хочу заменить «Test2» для строковой переменной? '(format:" name = '\ (variable)' ")' не работает. – paro

0

Вы можете использовать context.deleteObject(results?.first as! NSManagedObject) и он будет компилировать, но это приведет к краху, если это не NSManagedObject.

Это, очевидно, не правильный подход. Помните: ! - это запахи кода, потому что в большинстве случаев они вам не нужны.

firstObject является метод NSArray, чтобы использовать его, вы должны указать, что results имеет тип NSArray (т.е. let results: NSArray). Эквивалент стандартной библиотеки Swift равен first и возвращает необязательное значение, а deleteObject не принимает необязательный. Поэтому вы должны развернуть его, и вы можете проверить, есть ли он типа NSManagedObject в то же время.

А что-то вроде:

if let results = context.executeFetchRequest(fetchRequest, error:&error), 
     let managedObject = results.first as? NSManagedObject { 
     context.deleteObject(managedObject) 
    } 
+0

Я опробовал ваше предложение. Теперь я сбой приложения в этой строке кода: 'if let results = context.executeFetchRequest (fetchRequest, error: & error),' со следующей ошибкой: 'Thread 1: breakpoint 1.2 3.2'. Вот несколько (надеюсь) полезных изображений: https://www.dropbox.com/s/0ubnlnufodnsb2l/Bildschirmfoto%202015-07-12%20um%2019.27.06.png?dl=0 и https: // www. dropbox.com/s/5m9vdx2tlgns59o/Bildschirmfoto%202015-07-12%20um%2019.28.18.png?dl=0. Надеюсь, что это поможет решить эту ошибку. – paro

+0

Похоже, вы установили некоторые точки останова в своем коде, а не как ошибку. Пожалуйста, отключите свои контрольные точки, и он должен работать. – agy

+0

Я установил контрольную точку исключения. Я отключил его, но приложение все еще терпит крах. Теперь я также получаю запись в журнале (см. Мой обновленный ответ). Спасибо за вашу помощь. – paro

Смежные вопросы