我使用Apple的CoreDataBooks示例应用程序作为在后台将数据提取到辅助托管对象上下文的基础,然后将该数据合并到主要托管对象上下文中.
我所Book引入的数据是与Owner实体(称为"所有者")具有一对一关系的实体.该Owner实体与Book(称为"书籍")有很多关系.
我的数据是以下形式的XML文档:
<Owner>
<Name>alexpreynolds</Name>
<ID>123456</ID>
</Owner>
<Books>
<Book>Book One</Book>
<Book>Book Two</Book>
...
<Book>Book N</Book>
</Books>
Run Code Online (Sandbox Code Playgroud)
Book Onethrough Book N与one Owner("alexpreynolds, 123456")相关联.
我解析此为Owner实例和NSMutableSet组成的Book实例.
当我第一次尝试保存时,它保存得很好,合并的数据显示在表视图中.
但是,在第二次保存时,当XML内容包含新书时,它不起作用.
这是发生的事情:
然后,我尝试加载一个XML文档,该文档包含一个Book尚未在主要托管对象上下文中的新文档.新Book的使用Owner与其他Books 相关的相同.
我有例程挑选出这种独特的Owner管理对象(我已经在我的主要管理对象上下文)和独特的Book是没有在主MOC找到.
由此,我Book在辅助MOC中创建了一个新对象,并将其" owner"关系设置为指向Owner我在主要MOC中找到的唯一关系.
当我保存时,我收到以下错误:
*** Terminating app due to uncaught
exception 'NSInvalidArgumentException', …Run Code Online (Sandbox Code Playgroud) 我正在制作一个依赖Core Data的应用程序.我能够将数据输入文本字段并存储它.
但我需要知道数据是否存储.
我正在尝试向我的tableView创建一个detailView,但我没有得到任何结果.现在我想知道的是因为我的代码做错了,或者数据是否正确存储.
如何查看应用程序CoreData数据库中存储的内容?
我使用Xcode进行iOS开发.我有一些实体(例如,User),我需要为他的名字设置唯一约束,但我找不到如何通过可视化编辑器来实现它.是否可以通过GUI完成?或者只能通过代码?我很乐意得到一些截图.
这是我目前的NSPredicate:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"UPC==%@ OR ItemID==%@", aUPCCode,aUPCCode];
Run Code Online (Sandbox Code Playgroud)
如何使这个案例不敏感?
而且我不想做任何部分匹配.
例如,如果他们为aUPCCode输入123我不想得到123,123a,123b,123c等.我只想要完全匹配.
我想过这样做但看起来有点荒谬:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"UPC==%@ OR ItemID==%@ OR UPC==%@ OR ItemID==%@ OR UPC==%@ OR ItemID==%@", aUPCCode,aUPCCode,[ aUPCCode lowercaseString] ,[aUPCCode lowercaseString], [aUPCCode uppercaseString],[aUPCCode uppercaseString]];
Run Code Online (Sandbox Code Playgroud) 我有一个与单位有"多对多"关系的订单.当我尝试按顺序记录单位(NSSet)时,出现错误错误:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Order"
inManagedObjectContext:mainContext];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [mainContext executeFetchRequest:fetchRequest
error:nil];
for (Order *order in fetchedObjects) {
NSLog(@"%@", [order units]);
break;
}
[fetchRequest release];
Run Code Online (Sandbox Code Playgroud)
结果是:
Relationship 'units' fault on managed object (0x6d9dd00) <Order: 0x6d9dd00> (entity: Order; id: 0x6d88e40 <x-coredata://97A3F3D5-ABA7-499A-A460-5E25CF49C528/Order/p1> ; data: {
composition = Hemlock;
condition = "";
consignee = "";
consigneeCompanyName = "";
contactAlternatePhone = "";
contactEmail = "";
contactFirstName = "";
contactLastName = "";
contactPhone = "";
customer …Run Code Online (Sandbox Code Playgroud) 回来再次需要更多帮助构建我的NSPredicates :(
Category
{
name:string
subs<-->>SubCategory
}
SubCategory
{
name:string
numbervalue:NSNumber
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何使用AND和OR创建谓词.
例如,我想返回名称为=="category_name"的每个类别,该类别还具有数值为"valueA" 或 "valueB" 的子类别.
我已经尝试了所有可能的谓词构造函数组合,但是我无法让它工作.
到目前为止,这是我最好的尝试.
NSPredicate *predicate=[NSPredicate predicateWithFormat@"(name== %@) AND (ANY subs.numbervalue==%@ OR ANY subs.numbervalue==%@)", @"aname", value1, value2];
Run Code Online (Sandbox Code Playgroud)
编辑1
第二次尝试.对'numbervalue'的过滤仍然无效.
NSNumber valueA=[NSNumber numberWithInt:20];
NSNumber valueA=[NSNumber numberWithInt:90];
NSArray *arr=[NSArray arrayWithObject:valueA,valueB,nil];
predicate=[NSPredicate predicateWithFormat:@"(name==%@)AND(ANY subs.numbervalue IN %@)",@"aname",arr];
Run Code Online (Sandbox Code Playgroud)
编辑2
我尝试过使用numberValue进行过滤,并将名称全部删除.
1)使用此结果即使集合中只有1个项具有该值,也会返回整个集合.
predicate=[NSPredicate predicateWithFormat:@"(ANY subs.numbervalue IN %@)",arr];
Run Code Online (Sandbox Code Playgroud)
2)使用这会导致同样的问题,即使只有其中一个匹配,也会返回集合中的每个项目.
predicate=[NSPredicate predicateWithFormat:@"((SUBQUERY(subs, $x, $x.numbervalue == %@ or $x.numbervalue == %@).@count > 0)", value1, value2];
Run Code Online (Sandbox Code Playgroud)
同样使用最简单的版本会导致同样的问题......我之前没有注意到这一点.
NSPredicate *predicate=[NSPredicate predicateWithFormat@"(ANY subs.numbervalue==%@ …Run Code Online (Sandbox Code Playgroud) Codable似乎是一个非常令人兴奋的功能.但我想知道我们如何在核心数据中使用它?特别是,是否可以直接从/向NSManagedObject编码/解码JSON?
我尝试了一个非常简单的例子:
并定义Foo自己:
import CoreData
@objc(Foo)
public class Foo: NSManagedObject, Codable {}
Run Code Online (Sandbox Code Playgroud)
但是当它像这样使用时:
let json = """
{
"name": "foo",
"bars": [{
"name": "bar1",
}], [{
"name": "bar2"
}]
}
""".data(using: .utf8)!
let decoder = JSONDecoder()
let foo = try! decoder.decode(Foo.self, from: json)
print(foo)
Run Code Online (Sandbox Code Playgroud)
编译器因此错误而失败:
super.init isn't called on all paths before returning from initializer
Run Code Online (Sandbox Code Playgroud)
目标文件是定义的文件 Foo
我想我可能做错了,因为我甚至没有通过NSManagedObjectContext,但我不知道在哪里坚持下去.
核心数据是否支持Codable?
我有一个Core Data模型,其中Task实体包含一个可选的to-many关系excludedOccurrences.excludedOccurrences的一个属性是start,它是一个NSDate对象.ExcludedOccurrence实体与Task实体具有反向强制一对一关系.
为了获取指定日期的任务,我需要确保指定的日期不会显示为任何ExcludedOccurrence实体的start属性.因此,我试图使用的一个子谓词
NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"(ALL excludedOccurrences.start != %@))", today];
Run Code Online (Sandbox Code Playgroud)
今天是今天的NSDate对象,仅包括日,月和年组件.所有排除的事件启动属性也仅包括日,月和年组件.
虽然这应该没问题,至少阅读Core Data和NSPredicate的文档,但是我收到以下错误消息:
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'不支持的谓词
如果我使用等效谓词
NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"!(ANY excludedOccurrences.start == %@))", today];
Run Code Online (Sandbox Code Playgroud)
没有抛出任何异常,但代码不能按预期工作:而是排除了今天不应排除的事件.
我不确定如何测试caseOccurrences == nil:以下谓词
NSPredicate *nilPredicate = [NSPredicate predicateWithFormat: @"(excludedOccurrences == nil)"];
Run Code Online (Sandbox Code Playgroud)
在运行时导致异常
这里不允许使用多个密钥
但是,由于excludedOccurrences关系是可选的,我还需要测试它是否为零.
我该如何处理?先感谢您.
我正在为我的应用程序创建一个Core Data模型.我希望能够在里面查看我在那里存储的内容.
有没有比搜索后备存储更简单的方法(我的应该是SQLite)并从那里读取它?看起来不像苹果风格.
我正在尝试从我的datamodel生成NSManagedModel.生成有效但在我遇到很多错误之后:
错误:文件名"Station + CoreDataProperties.swift"使用了两次:'/ Users/Me/MyApp/Model/CoreData/LCD + CoreDataProperties.swift'和'/ Users/Me/Library/Developer/Xcode/DerivedData/MyApp-gwacspwrsnabomertjnqfbuhjvwc/Build/Intermediates/MyApp.build/Debug-iphoneos/MyApp.build/DerivedSources/CoreDataGenerated/Model/Station + CoreDataProperties.swift':0:注意:文件名用于区分具有相同名称的私有声明
我尝试清理build文件夹和derivedData目录硬删除.我正在使用Xcode 8 BETA也许这是一个错误?
core-data ×10
ios ×5
iphone ×3
nspredicate ×3
cocoa-touch ×1
codable ×1
objective-c ×1
swift ×1
swift3 ×1
swift4 ×1
xcode8 ×1
xcode9 ×1