标签: nsmanagedobject

Core Data将超类实例转换为子类实例?

以编程方式将NSManagedObject-subclass(User)实例转换为其子类(AccountUser)实例的最佳方法是什么?

建立

AccountUser继承自User:NSManagedObject

当我第一次注册或登录应用程序时,我成了一个AccountUser.然后,我下载所有朋友并将其存储为User对象.

这两个UserAccountUser有属性firstName,lastName等等.AccountUser有一些额外的东西,比如accessToken.

问题

我的朋友约翰登录我的设备.因为他是我的朋友,所以他已经存放了User.但现在,我想把他变成一个AccountUser.以编程方式执行此操作的最佳方法是什么?我有很多属性和关系要保留,所以AccountUserUser对象创建一个新对象然后删除原始User对象是很多事情要做.如果我只创建一个AccountUser没有删除的User东西,事情会变得混乱.例如,当我User通过ID 获取时,我得到两个对象:一个是AccountUser,另一个是User.

iphone core-data subclass superclass nsmanagedobject

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

CoreData和NSInvalidArgumentException无法识别的选择器发送到实例

在尝试设置我的属性"phoneNumber"时,我一直遇到此异常:

*由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [SearchResult setPhoneNumber:]:无法识别的选择器发送到实例0x256b40'

这是具有phoneNumber属性的类:

@interface SearchResult : NSManagedObject
@property (nonatomic, retain) NSString * phoneNumber;
@end

@implementation SearchResult
@dynamic phoneNumber;
@end
Run Code Online (Sandbox Code Playgroud)

问题是当我这样做时:

SearchResult *managedObject = [self findExistingSearchResultById:restaurantId];

if(managedObject == nil)
{ 
    managedObject = [NSEntityDescription insertNewObjectForEntityForName:@"SearchResult" inManagedObjectContext:managedObjectContext];
}

// Exception throws here.
managedObject.phoneNumber = @"1234567890";
Run Code Online (Sandbox Code Playgroud)

这是findExistingSearchResult方法:

+ (SearchResult *)findExistingSearchResultById:(NSString *)restaurantId
{
    NSManagedObjectContext *managedObjectContext = serviceContext;
    NSFetchRequest *request = [[NSFetchRequest alloc]init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"SearchResult" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"restaurantId = %@", restaurantId];
    [request setPredicate:predicate];

    NSError …
Run Code Online (Sandbox Code Playgroud)

iphone core-data objective-c nsmanagedobject ios5

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

使用辅助.h .m文件向NSManagedObject添加其他属性

我有一些NSManagedObject类创建用于CoreData我需要添加一些额外的属性来格式化我正在使用GRMustache模板.

这是一个示例属性:

-(NSString *) PriceFormatted {
    NSNumberFormatter *nfm = [[[NSNumberFormatter alloc] init] autorelease];
    [nfm setNumberStyle:NSNumberFormatterCurrencyStyle];
    [nfm setCurrencyCode:[Helpers GetCurrencyCode]];
    [nfm setNegativeFormat:@"-¤#,##0.00"];
    [nfm setMaximumFractionDigits:2];

    return [nfm stringFromNumber:self.Price];
}
Run Code Online (Sandbox Code Playgroud)

我目前在生成的NSManagedObject类中有这个,但如果我需要重新生成一个新的NSManagedObject类,这将导致问题.

我可以在辅助类集中定义这些属性 - 类似于C#中的部分属性吗?

objective-c nsmanagedobject

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

是否可以在一个 iOS 应用程序上拥有多个核心数据“数据库”?

我想编写一个大量利用核心数据的“管理”游戏。游戏需要预先设置、预定义的数据集,用户/系统无法更改;它用于为游戏提供数据种子,并且是只读的。

我能给出的最好的例子是足球管理游戏,但它可以是任何东西。在一些足球管理模拟游戏中,他们为您提供场景和预设数据集。

当用户继续游戏时,他们可以保存/加载保存到核心数据的进度。

除此之外,用户还可以接收预定义数据的更新或购买场景数据包;保存到他们的设备上。

因此,可能有多个“核心数据数据库”(是的,我知道核心数据严格来说并不是一个数据库)或应用程序可以深入使用的“存储桶”。

数据的架构不会改变。

所以我们有:

  1. 仅用于播种游戏的预定义数据(默认数据)。
  2. 用户当前保存的游戏。
  3. 用户已从互联网下载了一个场景。
  4. 问题:当用户在“场景”中保存游戏时会发生什么。
  5. 问题:如何跟踪核心数据中的所有场景和所有用户保存的游戏?

这听起来像是在给定时间有多个数据库。显然,应该限制用户可以保存游戏的数量。

另一种解决方案是用户的设备以 JSON 或 XML 格式导出数据的备份副本,并将其用作“保存数据”,我也可以在场景中使用此策略。显然,需要某种加密来防止人们通过 XML 简单地更改游戏中的统计数据。

但我从一开始就想知道使用 iOS 设备的核心数据处理多个核心数据“数据库”的最佳方式是什么?

谢谢你的时间

core-data multiple-databases nsmanagedobject nsentitydescription

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

创建 NSManagedObjectSubclasses 在我的项目之外生成类

我在使用 Create NSManagedObjectSubclasses 时遇到问题。当我在我的 Swift 项目中使用它时,所有生成的类文件都会自动保存在我的项目结构之外。然后我需要在我的项目中手动移动,每次都选中“如果需要,请复制项目”。

移动生成的类

我怎样才能避免这种行为?

xcode core-data project nsmanagedobject swift

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

不能专门化非泛型类型“Set”

这是我的NSManagedObject

@objc(Order)
class Order: NSManagedObject {

    @NSManaged var orderItems: Set<OrderItem> //error: Cannot specialize non-generic type 'Set'
}
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么它不起作用?

OrderItem 文件已创建并适用于以下声明:

@NSManaged var orderItem: OrderItem
Run Code Online (Sandbox Code Playgroud)

nsmanagedobject ios swift

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

Swift 3 核心数据 - Entity(context:) vs Entity(entity: Location.entity(), insertInto: context)

我看过 2016 年关于 Core Data 的 WWDC 视频并查看了各种教程。我已经看到了使用 Core Data Framework 创建对象以持久化到 managedObjectContext 的各种方法。

在示例中,我将其Day作为一个实体。我想Day为用户使用该应用程序的每一天创建一个新对象。

我遇到过:

第一个选项

let entity = NSEntityDescription.insertNewObject(forEntityName: "Day", into: CoreDataHelper.context)
let object = NSManagedObject(entity: entity, insertInto: CoreDataHelper.context)
Run Code Online (Sandbox Code Playgroud)

第二个选项

let object = Day(entity: Day.entity(), insertInto: CoreDataHelper.context)
Run Code Online (Sandbox Code Playgroud)

第三个选项

let object = Day(context: CoreDataHelper.context)
Run Code Online (Sandbox Code Playgroud)

并且知道人们还提出了其他可能性。

最下面的两个选项有什么区别,因为我在 WWDC 视频中没有看到第二个选项的演示。第三个选项是自动插入到 managedObjectContext 中还是应该采取某种方法将对象插入上下文中,然后使用 NSFetchedResultsController 检索所有对象。

entity core-data nsmanagedobject ios swift

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

使用具有未设置或设置为 NSKeyedUnarchiveFromDataTransformerName 的转换器名称的可转换属性

我收到错误:

此应用程序中的一个或多个模型正在使用可转换属性,其转换器名称要么未设置,要么设置为 NSKeyedUnarchiveFromDataTransformerName。

我什至还没有将任何数据保存到 Core Data 中。

Transformable 类型的属性“notificationIdentifiers”在我的 NSManagedObject 子类中属于 NSObject 类型。为什么错误说它未设置或设置为 NSKeyedUnarchiveFromDataTransformerName?

我也收到警告:

CoreData:警告:实体“Affirmation”上的属性“notificationIdentifiers”使用 nil 或不安全的 NSValueTransformer。请改用“NSSecureUnarchiveFromData”或 NSSecureUnarchiveFromDataTransformer 的子类。

这是我的 NSManagedObject 子类:

extension Affirmation {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Affirmation> {
        return NSFetchRequest<Affirmation>(entityName: "Affirmation")
    }

    @NSManaged public var body: String
    @NSManaged public var count: Int64
    @NSManaged public var days: NSData
    @NSManaged public var frequency: Int64
    @NSManaged public var notificationIdentifiers: NSObject
    @NSManaged public var recordName: String?
    @NSManaged public var time: NSDate
    @NSManaged public var timestamp: NSDate
    @NSManaged …
Run Code Online (Sandbox Code Playgroud)

core-data nsmanagedobject swift

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

如何在保存之前自动设置计算的NSManagedObject属性?

假设我有一个NSManagedObject名为的子类Item.每当item保存实例时,我想根据瞬态属性中的计算值更新属性.我知道只要瞬态属性发生变化,我就可以更新属性,但是对于这个问题,假设有一个很好的理由我不想这样做.

我尝试在willSave方法中执行以下操作:

- (void)willSave
{
    self.computedProperty = [self computedValueFromTransientProperty];
}
Run Code Online (Sandbox Code Playgroud)

这会在保存上下文时导致崩溃.如果我移出代码willSave并在调用save之前显式设置属性,它可以正常工作.apple docs说你应该避免更改托管对象属性willSave.

问题:是否有一种很好的方法可以在NSManagedObject子类中构建功能,因此可以在保存之前更新属性,无需在类外部显式设置属性,并且每次瞬态属性更改时都不设置属性?

core-data nsmanagedobject ios

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

我们应该指向具有弱指针而非强指针的NSManagedObject实体吗?

我认为因为NSManagedObject由managedObject上下文管理,所以指针应该是弱的.

然而,在我的情况下,它往往会回到0.

    for (CategoryNearby * CN in sorted) {
        //[arrayOfItems addObject:[NSString stringWithFormat:@"%@ - %d",CN.name,[CN.order intValue]]];
        NearbyShortcutTVC * tvc=[[NearbyShortcutTVC alloc]init];
        tvc.categoryNearby =CN;
//        tvc.titleString=[NSString stringWithFormat:@"%@",CN.name];
//        tvc.displayed=CN.displayed;
        [arrayOfItemsLocal addObject:tvc];
        //CN

        PO(tvc);
        PO(tvc.categoryNearby);
        while (false);
    }
    self.arrayOfItems = arrayOfItemsLocal;

    PO(self.categoriesNearbyInArrayOfItems);
    [self.tableViewa reloadData];
Run Code Online (Sandbox Code Playgroud)

...

然而在某个地方:

tvc.categoryNearby 变成零.

我不知道它是如何,何时或何地变为零.

我该如何调试?或者参考是否应该强大?

这是NearbyShortcutTVC的界面

@interface NearbyShortcutTVC : BGBaseTableViewCell{

}
@property (weak, nonatomic) CategoryNearby * categoryNearby;

@end
Run Code Online (Sandbox Code Playgroud)

为了确保我们正在讨论同一个对象,我打印了NSArray的所有内存地址

它们都是完全相同的对象.但不知何故,对象的categoryNearby属性在某处神奇地设置为null.

 self.categoriesNearbyInArrayOfItems: (
    0x883bfe0,
    0x8b6d420,
    0x8b6f9f0,
    0x8b71de0,
    0xb073f90,
    0xb061a10,
    0xb06a880,
    0x8b74940,
    0x8b77110,
    0x8b794e0,
    0x8b7bf40,
    0x8b7cef0,
    0x8b7f4b0,
    0x8b81a30,
    0x88622d0,
    0x8864e60,
    0xb05c9a0 …
Run Code Online (Sandbox Code Playgroud)

xcode objective-c nsmanagedobject

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