标签: nsmanagedobject

CoreData无法解决问题

我有一个非常烦人的问题,我似乎无法修复.

我有一个视图,当我发送一条消息,保存到核心数据,当它完成时它向数据库询问随机消息(句子)并将其保存到数据库中的另一行.

如果我最后一部分硬编码,没有从数据库中获取数据,它可以正常工作,但是只要我从数据库中获取随机行就会发疯.

在我的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

33
推荐指数
2
解决办法
3万
查看次数

"[copy copyWithZone:]:无法识别的选择器发送到实例时"使用Bindings/Core Data时

(自我询问和自我回答,因为我花了几个小时在网上寻找这个,大多数资源都说"我最终解决了它"而没有给出解释)

我有一个非常简单的Core Data + Bindings应用程序:

  • NSArrayController从Core Data中提取项目
  • NSTableView渲染它们
  • 另一个NSTableView,当您单击第一个表中的行时,显示该项的详细信息

上面的第3项导致应用程序崩溃,错误如下:

[(my NSManagedObject) copyWithZone:]: unrecognized selector sent to instance
Run Code Online (Sandbox Code Playgroud)

实现该方法(!)并在那里放置一个断点,我发现它是由Apple的NSCell类调用的 - 这没有多大帮助:(.

cocoa core-data cocoa-bindings nsmanagedobject

30
推荐指数
3
解决办法
2万
查看次数

如何在Swift中为NSManagedObject子类创建指定的初始值设定项?

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以使我的示例使用工作?

core-data nsmanagedobject ios swift

30
推荐指数
2
解决办法
2万
查看次数

核心数据:无法将"MyType_MyType_2"类型的值转换为MyType

我有一个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来自哪里?

casting core-data nsmanagedobject swift

27
推荐指数
3
解决办法
8998
查看次数

多个NSEntityDescriptions声明NSManagedObject子类

我正在创建一个允许我使用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)

core-data nsmanagedobject nsmanagedobjectcontext

27
推荐指数
5
解决办法
7238
查看次数

在NSManaged vars上使用属性观察器

我在类中声明了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变量实现这样的功能或类似的功能吗?

observers nsmanagedobject ios swift

26
推荐指数
1
解决办法
3674
查看次数

更改托管对象属性不会触发NSFetchedResultsController更新表视图

我有一个带谓词的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

25
推荐指数
2
解决办法
1万
查看次数

从Core-Data中删除特定条目/行

我在我的应用程序中使用核心数据,当涉及从核心数据存储中删除某些行或条目时,我感到很困惑.我将一些产品插入存储器中,如下所示:

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)

我非常感谢一些示例代码,因为我似乎无法想出这个代码.

谢谢你的帮助.

iphone xcode core-data objective-c nsmanagedobject

23
推荐指数
4
解决办法
3万
查看次数

核心数据合并两个托管对象上下文

我的Cocoa/Application在主线程上有一个托管对象上下文.当我需要更新我的数据时,我的程序将:

  1. 开始一个新的主题
  2. 从服务器接收新数据
  3. 创建新的托管对象上下文
  4. 向主线程发送通知以合并两个上下文

这是在主线程上接收通知的函数

- (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个上下文,以便为每个对象创建一个更新的副本.

更新1

这个问题现在对我来说很清楚了.2上下文有很大的不同:ObjectID.当主线程上的上下文使用持久存储协调器获取ManagedObjects时,第二个线程通过获取远程URL来创建这些对象.即使对象具有相同的内容,它们也将具有2个不同的objectID.

我的对象已经有一个唯一的标识符,我可以使用setObjectId来设置这个值.(Apple文档说这不是一个好主意).

cocoa core-data objective-c nsmanagedobject nsmanagedobjectcontext

22
推荐指数
1
解决办法
2万
查看次数

为什么我的Swift类的扩展在定义文件之外不可见?

我的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)

这些扩展方法可以在此定义文件中使用,但它们在其外部不可见.是什么导致了这个问题?

visibility nsmanagedobject ios swift

21
推荐指数
1
解决办法
9391
查看次数