以编程方式将NSManagedObject-subclass(User)实例转换为其子类(AccountUser)实例的最佳方法是什么?
AccountUser继承自User:NSManagedObject
当我第一次注册或登录应用程序时,我成了一个AccountUser.然后,我下载所有朋友并将其存储为User对象.
这两个User与AccountUser有属性firstName,lastName等等.AccountUser有一些额外的东西,比如accessToken.
我的朋友约翰登录我的设备.因为他是我的朋友,所以他已经存放了User.但现在,我想把他变成一个AccountUser.以编程方式执行此操作的最佳方法是什么?我有很多属性和关系要保留,所以AccountUser从User对象创建一个新对象然后删除原始User对象是很多事情要做.如果我只创建一个AccountUser没有删除的User东西,事情会变得混乱.例如,当我User通过ID 获取时,我得到两个对象:一个是AccountUser,另一个是User.
在尝试设置我的属性"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) 我有一些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#中的部分属性吗?
我想编写一个大量利用核心数据的“管理”游戏。游戏需要预先设置、预定义的数据集,用户/系统无法更改;它用于为游戏提供数据种子,并且是只读的。
我能给出的最好的例子是足球管理游戏,但它可以是任何东西。在一些足球管理模拟游戏中,他们为您提供场景和预设数据集。
当用户继续游戏时,他们可以保存/加载保存到核心数据的进度。
除此之外,用户还可以接收预定义数据的更新或购买场景数据包;保存到他们的设备上。
因此,可能有多个“核心数据数据库”(是的,我知道核心数据严格来说并不是一个数据库)或应用程序可以深入使用的“存储桶”。
数据的架构不会改变。
所以我们有:
这听起来像是在给定时间有多个数据库。显然,应该限制用户可以保存游戏的数量。
另一种解决方案是用户的设备以 JSON 或 XML 格式导出数据的备份副本,并将其用作“保存数据”,我也可以在场景中使用此策略。显然,需要某种加密来防止人们通过 XML 简单地更改游戏中的统计数据。
但我从一开始就想知道使用 iOS 设备的核心数据处理多个核心数据“数据库”的最佳方式是什么?
谢谢你的时间
core-data multiple-databases nsmanagedobject nsentitydescription
我在使用 Create NSManagedObjectSubclasses 时遇到问题。当我在我的 Swift 项目中使用它时,所有生成的类文件都会自动保存在我的项目结构之外。然后我需要在我的项目中手动移动,每次都选中“如果需要,请复制项目”。
我怎样才能避免这种行为?
这是我的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) 我看过 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 检索所有对象。
我收到错误:
此应用程序中的一个或多个模型正在使用可转换属性,其转换器名称要么未设置,要么设置为 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) 假设我有一个NSManagedObject名为的子类Item.每当item保存实例时,我想根据瞬态属性中的计算值更新属性.我知道只要瞬态属性发生变化,我就可以更新属性,但是对于这个问题,假设有一个很好的理由我不想这样做.
我尝试在willSave方法中执行以下操作:
- (void)willSave
{
self.computedProperty = [self computedValueFromTransientProperty];
}
Run Code Online (Sandbox Code Playgroud)
这会在保存上下文时导致崩溃.如果我移出代码willSave并在调用save之前显式设置属性,它可以正常工作.apple docs说你应该避免更改托管对象属性willSave.
问题:是否有一种很好的方法可以在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) nsmanagedobject ×10
core-data ×7
swift ×4
ios ×3
objective-c ×3
iphone ×2
xcode ×2
entity ×1
ios5 ×1
project ×1
subclass ×1
superclass ×1