标签: nsentitydescription

在NSManagedObjectModel中添加关系以编程方式创建NSEntityDescription

当你编写一个使用CoreData的静态库时,包含一个普通的.xdatamodeld文件会进入项目,因为你不能只将它的编译版本(.momd)链接到你的二进制文件中,所以最好NSManagedObjectModel在代码中创建整个这个:

NSAttributeDescription *dateAttribute = NSAttributeDescription.new;

dateAttribute.name = @"timestamp";
dateAttribute.attributeType = NSDoubleAttributeType;
dateAttribute.optional = NO;
dateAttribute.indexed = YES;

NSAttributeDescription *payloadAttribute = NSAttributeDescription.new;

payloadAttribute.name = @"payload";
payloadAttribute.attributeType = NSBinaryDataAttributeType;
payloadAttribute.optional = NO;
payloadAttribute.indexed = NO;

NSEntityDescription *entry = NSEntityDescription.new;

entry.name = entry.managedObjectClassName = NSStringFromClass(MyCustomEntry.class);
entry.properties = @[dateAttribute, payloadAttribute];

NSManagedObjectModel *mom = NSManagedObjectModel.new;

mom.entities = @[entry];
Run Code Online (Sandbox Code Playgroud)

一切都很完美......

但!等等,如果我有多个实体NSManagedObjectModel并且它们是相关的(多对数,反向等等),那么在世界上我将如何在代码中连接它们,就像上面的例子一样,没有那个漂亮的Xcode编辑器,你通过几次鼠标点击建立关系?

想象一下,我们有一个MyCustomElement类,它与上面代码中的MyCustomEntry几乎相同.现在,这是他们的界面,如果我使用Xcode生成实体它们将如何出现:

@interface MyCustomEntry : NSManagedObject

@property (nonatomic, retain) NSNumber *timestamp;
@property (nonatomic, retain) NSData *payload;
@property (nonatomic, retain) MyCustomElement *element; …
Run Code Online (Sandbox Code Playgroud)

cocoa core-data objective-c nsmanagedobject nsentitydescription

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

如何在Swift3中向实体插入新数据?

在之前的swift中,我能够使用这样的代码在我的数据模型中向我的"TestEntity"添加新数据.

NSManagedObject 是为我的"TestEntity"创建的,我能够使用"dot"语法设置其属性

最后,我会保存上下文

let entity=NSEntityDescription.insertNewObject(forEntityName: "TestEntity", into: context) as! TestEntity
entity.testAttribute="test value"
context.save()
Run Code Online (Sandbox Code Playgroud)

此代码在Swift3中不起作用.当我运行它时,我得到以下运行时错误:

无法将'NSManagedObject_TestEntity_'(0x175306b0)类型的值转换为'testCoreData.TestEntity'(0xd6bb8).2016-06-19 11:07:52.305195 testCoreData [689:264453]无法将'NSManagedObject_TestEntity_'(0x175306b0)类型的值转换为'testCoreData.TestEntity'(0xd6bb8)

任何人都可以了解如何在swift3中完成这项工作,好吗?任何帮助都非常感谢.谢谢.

问题的第二部分是如何再次访问数据.以下代码以错误结束:致命错误:NSArray元素无法匹配Swift数组元素类型

let fr:NSFetchRequest<TestEntity>=TestEntity.fetchRequest()

do {
   let searchResults=try context.fetch(fr)
   if let results=searchResults {
      for result in results {
         print("testAtt = \(result.testAtt)")
      }
   }
} catch {

}
Run Code Online (Sandbox Code Playgroud)

core-data nsmanagedobject nsentitydescription swift swift3

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

核心数据NSPredicate按实体类过滤?

如何NSPredicate按类的实体创建过滤器Contact

NSPredicate的解决方案检查对象类崩溃的类型:

[NSPredicate predicateWithFormat:@"person.class == %@", [Contact class]];

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
    reason: 'keypath person.class not found in entity <NSSQLEntity User id=12>'
Run Code Online (Sandbox Code Playgroud)

背景

我有核心数据实体User(app用户)和Contact(地址簿联系人),两个孩子Person(抽象实体).Person有很多identities,可以是emails,phonesusernames.

要创建类似文本消息的typeahead,我想创建一个NSFetchRequestfor 类的Identity实体.personContact

class core-data nspredicate nsfetchrequest nsentitydescription

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

为什么NSManagedObject和NSEntityDescription是单独的类?

似乎一个NSEntityDescription对象描述数据,一个NSManagedObject对象包含相应的数据.如果您有一个普通的NSObject子类,那么数据的描述和实际数据都在同一个地方,不是它们.好吧,至少描述在类中,数据在对象中.您可以将对象视为具有其包含的变量类型的描述.

那么为什么Core Data将描述数据的类和包含数据的类分开呢?它与断层有关吗?

iphone cocoa core-data nsmanagedobject nsentitydescription

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

检查NSEntityDescription键是否存在

NSEntityDescription在尝试设置值之前,我需要检查密钥是否存在.我有一个来自JSON的数据字典,并且不想尝试设置我的对象中不存在的键.

Appointment *appointmentObject = [NSEntityDescription insertNewObjectForEntityForName:@"Appointments" inManagedObjectContext:[[DataManager sharedInstance] managedObjectContext]];
for (id key in dict) {
    // Check if the key exists here before setting the value so we don't error out.
        [appointmentObject setValue:[dict objectForKey:key] forKey:key];
}
Run Code Online (Sandbox Code Playgroud)

core-data objective-c nsentitydescription ios5

4
推荐指数
2
解决办法
3287
查看次数

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

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

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

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

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

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

数据的架构不会改变。

所以我们有:

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

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

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

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

谢谢你的时间

core-data multiple-databases nsmanagedobject nsentitydescription

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

如何获得NSAttributeDescription?

我有一个User : NSManagedObject.获得NSAttributeDescription它的userID属性的最佳方法是什么?

core-data objective-c nsmanagedobject nsentitydescription nsattributedescription

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

使用NSManagedObject的EXC_BAD_ACCESS

我试图在多个表中插入值(准确地说是25),我能够在所有表中插入记录,除了一个,这是因为一个属性,如果我删除该属性,它开始保存数据到表中但是当我添加该属性并尝试设置其值时,它以EXC_BAD_ACCESS终止.

我尝试更改属性的名称,甚至表格,但没有工作.下面是我的代码::

Ashes *ashesObj = (Ashes *)[NSEntityDescription insertNewObjectForEntityForName:@"Ashes" inManagedObjectContext:managedObjectContext];

[ashesObj setAshes_id:@""];
[ashesObj setArrangement_id:@"34"];
[ashesObj setCasket_order_date:@""];
[ashesObj setCasket_model:@""];
[ashesObj setCasket_supplier:@""];
//[ashesObj setAshes_address:@"N/A"];    (This one is causing problem)
[ashesObj setPostal_code:@"N/A"];
[ashesObj setName_client:@""];
[ashesObj setTelephone:@""];
[ashesObj setEmail:@""];

    NSError *error;

if (![managedObjectContext save:&error])
{
    NSLog(@"Problem saving: %@", [error localizedDescription]);
}
Run Code Online (Sandbox Code Playgroud)

iphone core-data nsmanagedobject nsentitydescription

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

CoreData获取属性类型 - 如何确定它是否是基元

我正在尝试获取实体的所有属性,然后确定它们的类型 - 我知道我可以在这一行上做点什么:

if(![[thisAttribute attributeValueClassName] isKindOfClass:[NSString class]]) {
Run Code Online (Sandbox Code Playgroud)

但是如何检查BOOL,Float或Integer?

到目前为止,这是我的代码:

//get the attributes for this entity - we need to parse the dictionary of data we want to store and convert its contents from NSStrings to whatever type the entity requires
    NSEntityDescription* entity = [NSEntityDescription entityForName:strEntityName inManagedObjectContext:myMOC];
    NSDictionary* dictAttributes = [entity attributesByName];

    for(NSString* strThisKey in dictAttributes) {

        NSAttributeDescription* thisAttribute = [dictAttributes objectForKey:strThisKey];
        NSString* strAttributeType = [thisAttribute attributeValueClassName];

        //look for a match in the data keys (the dict we passed) with …
Run Code Online (Sandbox Code Playgroud)

core-data objective-c nsentitydescription nsattributedescription

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

OCMock - 试图模拟NSEntityDescription

为了测试托管类,我尝试在单元测试中创建一个实例,首先尝试模拟NSEntityDescription和NSManagedObjectContext.

id mockEntityDesc = [OCMockObject niceMockForClass:[NSEntityDescription class]];
id mockManagedObjectContext = [OCMockObject mockForClass:NSManagedObjectContext.class];
Run Code Online (Sandbox Code Playgroud)

但在我进一步研究之前,我在测试运行时遇到以下错误;

体系结构i386的未定义符号:"_ OBJC_CLASS _ $ _ NSEntityDescription",引自:CallsCoordinatorTests.o中的objc-class-ref"_OBJC_CLASS _ $ _ NSManagedObjectContext",引自:CallsCoordinatorTests.o中的objc-class-ref ld:未找到符号对于体系结构i386 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

有什么建议吗?谢谢

objective-c ocmock nsmanagedobjectcontext ios nsentitydescription

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