标签: nsmanagedobject

iOS 核心数据瞬变如何工作?

我正在尝试了解 iOS Core 数据瞬态属性,但在理解某些行为时遇到了麻烦。

设置

我有两个上下文,一个主上下文和一个私有上下文。我称它们为 mainContext 和 threadedContext 。

线程上下文是父上下文,主上下文是子上下文。(我这样做是因为我的线程上下文比我的主线程和 UI 更频繁地更改模型。

我有需要通过上下文传递的值的瞬态属性。

我发现有时我失去了价值,有时我不依赖于我如何运行。

样本

此代码已被简化以显示问题。我有一个 Person 对象。Person 对象有一个名为“other”的瞬态实体,您将看到我为其分配了一个 Other 对象,该对象具有几个简单的属性,仅此而已。

- (void)case1
{

NSManagedObjectContext *mainThreadContext = [AppDelegate appDelegate].mainThreadContext;
NSManagedObjectContext *threadedContext = [AppDelegate appDelegate].threadedContext;

__block NSManagedObjectID *objectID = nil;

[mainThreadContext performBlockAndWait:^{
    //create
    Person *aPerson = [self createAPersonOnContext:mainThreadContext];

    //setup
    Other *other = [[Other alloc] init];

    aPerson.other = other;

    aPerson.other.favoriteColor = @"Blue";
    aPerson.other.city = @"Provo";

    //save
    NSError *error = nil;
    [mainThreadContext save:&error];

    objectID = aPerson.objectID;

    NSLog(@"%@",aPerson);

}];    
}
Run Code Online (Sandbox Code Playgroud)

当我像这样检索对象时,仍然设置了 person.other 属性(请注意,我在检索对象后正在保存: …

core-data nsmanagedobject nsmanagedobjectcontext ios

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

如何在核心数据上实现瞬态属性?

我有一个名为“国家”的核心数据实体。该实体有一个名为 nameOfCountry 的字段,其中包含英语国家/地区名称。我需要将其本地化为其他语言,因此我创建了一个名为 nameOfCountryLocalized 的临时属性。

在国家类中,我正在导入此类别

国家+NameOfCountryLocalized.h

#import "Countries.h"

@interface Countries (NameOfCountryLocalized)


@property (nonatomic, strong) NSString * nameOfCountryLocalized;


@end
Run Code Online (Sandbox Code Playgroud)

国家+NameOfCountryLocalized.m

#import "Countries+NameOfCountryLocalized.h"
#import "Countries.h"

@implementation Countries (NameOfCountryLocalized)

@dynamic nameOfCountryLocalized;


-(NSString *) nameOfCountryLocalized {
  [self willAccessValueForKey:@"nameOfCountryLocalized"];
  NSString *nameLocalized = NSLocalizedString(self.nomePais, nil);
  [self didAccessValueForKey:@"nameOfCountryLocalized"];
  return nomeLocalizado;
}

-(void)setNameOfCountryLocalized:(NSString *) nameLocalized {
  [self willChangeValueForKey:@"nameOfCountryLocalized"];
  [self setNomePaisLocalizado:];
  [self didChangeValueForKey:@"nameOfCountryLocalized"];
}

@end
Run Code Online (Sandbox Code Playgroud)

当我尝试使用 tableViewController 访问 nameOfCountryLocalized 时

- (NSFetchedResultsController *)fetchedResultsController {

  if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
  }


  NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; …
Run Code Online (Sandbox Code Playgroud)

cocoa-touch core-data nsfetchedresultscontroller nsmanagedobject ios

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

是否可以在 NSUserDefaults 中保存 NSManagedObject?

我在 userDefaults 中保存 NSManagedObject 有困难,我想知道 a) 我应该尝试这样做还是这不是一种合适的方法,或者 b) 如果它是一种合适的方法,我怎样才能让它工作?

我正在用 Swift 2.3 编写我的应用程序,它有一些用户默认选项,其中一个用于默认“提升”(如举重,例如“卧推”、“挺举”、“倾斜卧推” )。我实际上将它们从枚举转换为核心数据实体,因为用户能够跟踪的每个电梯事件都将是可用的电梯类型之一(我将为其建立适当的关系)。

这是具有属性的扩展:

extension Lift {

    @NSManaged var liftName: String
    @NSManaged var type: NSSet

   }
Run Code Online (Sandbox Code Playgroud)

以及带有 Xcode 抱怨的 Lift 实体:

class Lift: NSManagedObject, NSCoding {
    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(liftName, forKey: "liftName")
    } // Super.init isn't called on all paths before returning from initializer

required init(coder aDecoder: NSCoder) {

    // Initialization of immutable variable was never used, etc...
    let liftName = aDecoder.decodeObjectForKey("liftName") as! String

    }
  }
Run Code Online (Sandbox Code Playgroud)

我以前处理过这些类型的错误,所以我真正关心的是我是否走上了错误的道路。

今晚我读了很多线程,这些线程告诉我我需要对一个对象(但不是特别是 …

core-data nsuserdefaults nsmanagedobject ios swift

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

当上下文初始化为内联时,为什么 NSManagedObject 不会插入到子 NSManagedObjectContext 中?

NSManagedObjectContext在我的 iOS 应用程序中使用 child 作为便签本。我正在使用 的扩展NSManagedObjectContext来创建子上下文,如下所示:

extension NSManagedObjectContext {
    func childContext(concurrencyType: NSManagedObjectContextConcurrencyType = .mainQueueConcurrencyType) -> NSManagedObjectContext {
        let childContext = NSManagedObjectContext(concurrencyType: concurrencyType)
        childContext.parent = self
        return childContext
    }
}
Run Code Online (Sandbox Code Playgroud)

NSManagedObject当将新的内容插入新的子上下文(从viewContexta创建NSPersistentContainer)时,我的应用程序的一部分重复出现错误,并显示以下消息:

CoreData:错误:从上下文中删除托管对象后对其进行更改

这很奇怪,因为应用程序的其他部分(也使用子上下文)运行良好。NSManagedObject最终,我将原因缩小到将新的(实体名称“Book”)插入新的子上下文的方式上的一个小差异。以下内容按预期工作:

let childContext = container.viewContext.childContext()
let object1 = NSEntityDescription.insertNewObject(forEntityName: "Book", into: childContext)
print(object1.managedObjectContext == nil)
// prints "false"
Run Code Online (Sandbox Code Playgroud)

但是,如果我内联创建子上下文(即未分配给变量,则托管对象不会插入到上下文中):

let object2 = NSEntityDescription.insertNewObject(forEntityName: "Book", into: container.viewContext.childContext())
print(object2.managedObjectContext == nil)
// prints "true"
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很奇怪并且无法弄清楚。一切都在主线程上运行。我还创建了一个Swift …

core-data nsmanagedobject nsmanagedobjectcontext ios swift

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

为什么在重新启动应用程序或我执行 NSBatchDeleteRequest 两次之前不会删除条目?

我正在阅读删除/重置 Core Data 中的所有条目?.

如果我按照以下步骤操作,会得到意想不到的结果:

  1. 调用下面的代码
  2. 然后在模拟器中查询一个实体,我会取回一个实体!!!
  3. 如果我clearCoreDataStore再次调用(或重新启动),则不会从核心数据中检索该值

我错过了什么?

func clearCoreDataStore() {
    let entities = dataManager.persistentContainer.managedObjectModel.entities
    for entity in entities {
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity.name!)
        let deleteReqest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
        do {
            try context.execute(deleteReqest)
        } catch {
            print(error)
        }
    }
    dataManager.saveContext()
}
Run Code Online (Sandbox Code Playgroud)

core-data nsmanagedobject nsmanagedobjectcontext ios nsbatchdeleterequest

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

将方法添加到NSManagedObject的子类

我想在对象上添加一个方法(从NSManagedObject子类化)

@interface REMBox : NSManagedObject {
}
- (int)singleValueForIndex:(int)index;
@property (nonatomic,retain) NSString *name;    
Run Code Online (Sandbox Code Playgroud)

但该方法不能使用

REMBox *box = ....
BOOL canCallMessage = [box respondsToSelector:@selector(singleValueForIndex:)];
// canCallMessage is NO
int a = [box singleValueForIndex:4];
// that crashes :-(
Run Code Online (Sandbox Code Playgroud)

我的错是什么 REMBox的正常(核心数据)属性运行良好.

iphone cocoa core-data objective-c nsmanagedobject

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

搜索到NSManagedObjects数组

假设我已经检索了一个托管对象数组(一个Car对象数组).让我们说a Car有像make和的属性model.Cars目前在NSArray.

如何查找所有具有属性honda值的汽车make

core-data nspredicate nsmanagedobject ios

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

删除NSManagedObjectContext

我正在尝试创建一个应用程序,用户可以在其中编辑managedObject视图中的a 属性,并选择Done保留更改或Cancel撤消更改.

为了实现这种行为,我打算做以下事情 -

  • 加载视图控制器进行编辑时managedObject,创建一个backupManagedObject原始的克隆managedObject.
  • backupManagedObject是在单独的子ManagedObjectContext中创建的.
  • 让用户编辑原始内容managedObject.
  • 如果:
    • Done按下,原始文件managedObject被保留,备份被删除
    • Cancel按下,将backupManagedObject其克隆为原始文件managedObject并删除备份

我的问题是,一旦我完成了backupManagedObject,我怎么能删除childManagedObjectContext哪个将没有更多的托管对象,我不打算再使用它们(对于每个新的视图控制器,我打算只创建一个新的子托管对象上下文并在视图控制器完成后将其销毁).

core-data objective-c nsmanagedobject nsmanagedobjectcontext ios

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

CoreData - 使用类别的等效w /示例 - Swift

我想知道如何在下面为我的CoreData NSManagedObject客户端创建一个类别的等价物:

我知道扩展现在是Swift中类别的替代 - 但不确定它们的实现.以下是我在下面扣除的内容:

class Client: NSManagedObject {

    @NSManaged var name: String
    @NSManaged var projects: NSSet

}

extension Client {

    func addClientWithName(name:NSString, context:NSManagedObjectContext) -> Client {
        var client:Client = Client();

        // Check for name in the database already exists
        let request:NSFetchRequest = NSFetchRequest(entityName: "Client")
        let sortDescriptor:NSSortDescriptor = NSSortDescriptor(key: "name", ascending: true)
        let sortDescriptorsAry:NSArray = [sortDescriptor]
        request.sortDescriptors = sortDescriptorsAry
        request.predicate = NSPredicate(format: "name = %@", name)

        var error:NSError?
        let matches:NSArray = context.executeFetchRequest(request, error: &error)

        if matches.count == 0 {

            //Add …
Run Code Online (Sandbox Code Playgroud)

core-data nsmanagedobject ios swift

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

使用NSURL检索托管对象ID

我正在尝试从保存在用户默认值中的NSURL中检索和创建托管对象,但我无法弄清楚如何使用managedObjectIDForURIRepresentation函数.我的代码看起来像这样:

func setCoreData(){
    let defaults = NSUserDefaults.standardUserDefaults()
    let usedKeyName = "timerList"
    let usedList = defaults.objectForKey(usedKeyName) as? [NSURL] ?? []
    let url:NSURL = usedList[0] as NSURL

    let managedobject:NSManagedObjectID = //What do I write here?

}
Run Code Online (Sandbox Code Playgroud)

任何建议,将不胜感激.

core-data nsmanagedobject nsmanagedobjectcontext ios swift

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