我有一个非常烦人的问题,我似乎无法修复.
我有一个视图,当我发送一条消息,保存到核心数据,当它完成时它向数据库询问随机消息(句子)并将其保存到数据库中的另一行.
如果我最后一部分硬编码,没有从数据库中获取数据,它可以正常工作,但是只要我从数据库中获取随机行就会发疯.
在我的AppDelegate.m中:
- (void)save {
NSAssert(self.context != nil, @"Not initialized");
NSError *error = nil;
BOOL failed = [self.context hasChanges] && ![self.context save:&error];
NSAssert1(!failed,@"Save failed %@",[error userInfo]);
}
- (NSString*)selectRandomSentence
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Sentences" inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
NSError *error = nil;
NSUInteger count = [self.context countForFetchRequest:request error:&error];
NSUInteger offset = count - (arc4random() % count);
[request setFetchOffset:offset];
[request setFetchLimit:1];
NSArray *sentenceArray = [self.context executeFetchRequest:request error:&error];
[request release];
return [[sentenceArray objectAtIndex:0] sentence]; …Run Code Online (Sandbox Code Playgroud) core-data objective-c nsmanagedobject nsmanagedobjectcontext ios
(自我询问和自我回答,因为我花了几个小时在网上寻找这个,大多数资源都说"我最终解决了它"而没有给出解释)
我有一个非常简单的Core Data + Bindings应用程序:
上面的第3项导致应用程序崩溃,错误如下:
[(my NSManagedObject) copyWithZone:]: unrecognized selector sent to instance
Run Code Online (Sandbox Code Playgroud)
实现该方法(!)并在那里放置一个断点,我发现它是由Apple的NSCell类调用的 - 这没有多大帮助:(.
class Alternative: NSManagedObject {
@NSManaged var text: String
@NSManaged var isCorrect: Bool
@NSManaged var image: NSData
}
convenience init(text: String, isCorrect: Bool, entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext!) {
let alternative = Alternative(entity: entity, insertIntoManagedObjectContext: context) as Alternative
alternative.text = text
alternative.isCorrect = isCorrect
return alternative
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个方法,让我用这个调用初始化新对象:
let newAlternative = Alternative("third platform", True, entityDescription, managedObjectContext)
Run Code Online (Sandbox Code Playgroud)
但我得到错误:
Convenience initializer for Alternative must delegate with self.init
Run Code Online (Sandbox Code Playgroud)
我需要更改我的initalizer以使我的示例使用工作?
我有一个Objective-C模型类MyType.这个类用在Swift代码中:
NSEntityDescription.insertNewObjectForEntityForName("MyType", inManagedObjectContext: context) as! MyType
Run Code Online (Sandbox Code Playgroud)
该as!投导致错误信息
Core Data: Could not cast value of type 'MyType_MyType_2' (0x7be99a30) to MyType (0xf33db74).
Run Code Online (Sandbox Code Playgroud)
如果我按照NSManagedObject它的方式投射它.当我打印结果时,我仍然可以看到,它是MyType的实际实例:
<MyType: 0x7ae06d50> (entity: MyType; id: 0x7aeba6d0 <x-coredata:///MyType/t957F2860-85F8-46E0-B6D6-4D1DF6C4EC613> ; data: {
...the fields...
})
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?这个名字MyType_MyType_2来自哪里?
我正在创建一个允许我使用Core Data的框架.在框架的测试目标中,我已经配置了一个名为的数据模型MockModel.xcdatamodeld.它包含一个名为MockManaged具有单个Date属性的实体.
所以我可以测试我的逻辑,我正在创建一个内存存储.当我想验证我的保存逻辑时,我创建了一个内存存储的实例并使用它.但是,我一直在控制台中获得以下输出:
2018-08-14 20:35:45.340157-0400 xctest[7529:822360] [error] warning: Multiple NSEntityDescriptions claim the NSManagedObject subclass 'LocalPersistenceTests.MockManaged' so +entity is unable to disambiguate.
CoreData: warning: Multiple NSEntityDescriptions claim the NSManagedObject subclass 'LocalPersistenceTests.MockManaged' so +entity is unable to disambiguate.
2018-08-14 20:35:45.340558-0400 xctest[7529:822360] [error] warning: 'MockManaged' (0x7f986861cae0) from NSManagedObjectModel (0x7f9868604090) claims 'LocalPersistenceTests.MockManaged'.
CoreData: warning: 'MockManaged' (0x7f986861cae0) from NSManagedObjectModel (0x7f9868604090) claims 'LocalPersistenceTests.MockManaged'.
2018-08-14 20:35:45.340667-0400 xctest[7529:822360] [error] warning: 'MockManaged' (0x7f986acc4d10) from NSManagedObjectModel (0x7f9868418ee0) claims 'LocalPersistenceTests.MockManaged'.
CoreData: warning: 'MockManaged' (0x7f986acc4d10) from …Run Code Online (Sandbox Code Playgroud) 我在类中声明了var,如下所示:
@NSManaged var isFavorite: Bool
Run Code Online (Sandbox Code Playgroud)
我想宣布一个属性观察者,非常类似于下面的那个.
var organization: String {
didSet { postNotificationWithName( "newData" ) }
}
Run Code Online (Sandbox Code Playgroud)
但是,Swift告诉我,NSManaged不允许在vars 上拥有财产观察员.有什么方法可以为我的isFavorite变量实现这样的功能或类似的功能吗?
我有一个带谓词的fetchedResultsController,其中"isOpen == YES"
在调用closeCurrentClockSet时,我将该属性设置为NO.因此,它应该不再出现在我的tableView上.
出于某种原因,这种情况并没有发生.
有人可以帮我解决这个问题吗?
-(void)closeCurrentClockSet
{
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"isOpen == YES"];
NSArray *fetchedObjects =
[self fetchRequestForEntity:@"ClockSet"
withPredicate:predicate
inManagedObjectContext:[myAppDelegate managedObjectContext]];
ClockSet *currentClockSet = (ClockSet *)fetchedObjects.lastObject;
[currentClockSet setIsOpen:[NSNumber numberWithBool:NO]];
}
Run Code Online (Sandbox Code Playgroud)
-
通过调用自定义fetchRequestForEntity:withPredicate:inManagedObjectContext方法,我有更多方法,使用完全相同的方法.
在这些方法中,更改属性时,tableView会正确更新!但是这一个上面(closeCurrentClockSet),没有!我无法弄清楚为什么.
-
我对fetchedResultsController的实现来自Apple的文档.
另外,另一个细节.如果我将我的应用程序发送到后台.关闭它并重新打开,tableView显示更新应该!
我尽力在stackOverflow上关注之前的问题.没运气.我也NSLogged这个骨头.正确获取对象.这是正确的.isOpen属性正在更新为NO.但由于某种原因,我的fetchedResultsController不更新tableView.
我确实尝试过几个"锤子"解决方案,比如reloadData和调用performFetch.但那没用.或者使用它们会有意义......
编辑:抓住它,DID工作,在我的resultsController上的performFetch之后调用reloadData imediatly但是使用reloadData正在敲定一个解决方案.此外,它还会取消所有动画.我希望我的控制器自动更新我的tableView.
有人可以帮我解决这个问题吗?
任何帮助是极大的赞赏!
谢谢,
努诺
编辑:
完整的实施.
fetchedResultsController非常标准和简单.其他一切都来自Apple的文档
- (NSFetchedResultsController *)fetchedResultsController
{
if (_fetchedResultsController) {
return _fetchedResultsController;
} …Run Code Online (Sandbox Code Playgroud) objective-c nsfetchedresultscontroller nsmanagedobject nsmanagedobjectcontext ios
我在我的应用程序中使用核心数据,当涉及从核心数据存储中删除某些行或条目时,我感到很困惑.我将一些产品插入存储器中,如下所示:
NSManagedObject *Product = [NSEntityDescription insertNewObjectForEntityForName:@"Product" inManagedObjectContext:context];
[Product setValue:[NSNumber numberWithFloat:id] forKey:@"pid"];
[Product setValue:[NSNumber numberWithFloat:quantity] forKey:@"pquantity"];
Run Code Online (Sandbox Code Playgroud)
这适用于插入.但是,稍后在应用程序中,我想删除条目,例如,pid是53.如何才能删除此行/条目?等效的SQL将是这样的:
DELETE from Product WHERE pid = '53'
Run Code Online (Sandbox Code Playgroud)
我非常感谢一些示例代码,因为我似乎无法想出这个代码.
谢谢你的帮助.
我的Cocoa/Application在主线程上有一个托管对象上下文.当我需要更新我的数据时,我的程序将:
这是在主线程上接收通知的函数
- (void)loadManagedObjectFromNotification:(NSNotification *)saveNotification
{
if ([NSThread isMainThread]) {
[self.managedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification];
} else {
[self performSelectorOnMainThread:@selector(loadManagedObjectFromNotification:) withObject:saveNotification waitUntilDone:YES];
}
}
Run Code Online (Sandbox Code Playgroud)
我没有收到任何错误.我的问题是合并结果,它实际上连接了两个上下文中的Managed Objects.
我的实体是一个非常简单的属性和关系列表.
也许合并需要一些指令,以便了解更新的托管对象何时不是新的,而是第一个的编辑版本.我想在某个地方我需要指定一种方式来单义地识别实体,(例如,属性可以像ID一样)和类似合并策略的东西(如果2个被管理对象代表同一个对象,请使用lastModificationDate更多)最近).
我只需要了解如何正确合并2个上下文,以便为每个对象创建一个更新的副本.
这个问题现在对我来说很清楚了.2上下文有很大的不同:ObjectID.当主线程上的上下文使用持久存储协调器获取ManagedObjects时,第二个线程通过获取远程URL来创建这些对象.即使对象具有相同的内容,它们也将具有2个不同的objectID.
我的对象已经有一个唯一的标识符,我可以使用setObjectId来设置这个值.(Apple文档说这不是一个好主意).
cocoa core-data objective-c nsmanagedobject nsmanagedobjectcontext
我的CoreData模型有一个Xcode生成的NSManagedObject类.
@objc(SomeClass) class SomeClass : NSManagedObject { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
它在名为"SomeClass.swift"的文件中定义.我想扩展这个类,所以我创建了'SomeClassExtension.swift'.我像这样定义扩展:
extension SomeClass {
class func typeMethod1() {}
func instanceMethod2() {}
}
Run Code Online (Sandbox Code Playgroud)
这些扩展方法可以在此定义文件中使用,但它们在其外部不可见.是什么导致了这个问题?
nsmanagedobject ×10
core-data ×7
ios ×5
objective-c ×4
swift ×4
cocoa ×2
casting ×1
iphone ×1
observers ×1
visibility ×1
xcode ×1