我正在尝试在Core Data中找到特定属性中最早的日期.我在"核心数据编程指南"中找到了一个例子,它的目的是做到这一点,但是当我运行它时仍然会收到一个无法识别的选定错误.
我的代码(只有Apple示例的最小更改):
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Session" inManagedObjectContext: ctx];
[request setEntity:entity];
// Specify that the request should return dictionaries.
[request setResultType:NSDictionaryResultType];
// Create an expression for the key path.
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"startedAt"];
// Create an expression to represent the minimum value at the key path 'creationDate'
NSExpression *minExpression = [NSExpression expressionForFunction:@"min:" arguments:[NSArray arrayWithObject:keyPathExpression]];
// Create an expression description using the minExpression and returning a date.
NSExpressionDescription *expressionDescription …Run Code Online (Sandbox Code Playgroud) 我总是在代码中创建我的NSFetchRequests.现在我正在寻找Xcode GUI来构建一个获取请求并将其存储在模型中.
我正在关注Xcode文档中的一个示例.我向模型添加了一个获取请求,并且通过Modeling GUI创建的谓词是:
firstName LIKE[c] "*SUBSTRING*"
Run Code Online (Sandbox Code Playgroud)
然后我用这两行检索该请求:
NSDictionary *substituionDictionary = [NSDictionary dictionaryWithObject:@"woody" forKey:@"SUBSTRING"];
NSFetchRequest *fetchRequest = [mom fetchRequestFromTemplateWithName:@"firstNameContains" substitutionVariables:substituionDictionary];
Run Code Online (Sandbox Code Playgroud)
生成的NSFetchRequest的NSLog输出:
(entity: Customer; predicate: (firstName LIKE[c] "*SUBSTRING*"); sortDescriptors: (null); limit: 0)
Run Code Online (Sandbox Code Playgroud)
..表示在返回存储的FetchRequest之前未替换变量.
那么,如何指定在Xcode数据建模获取请求谓词生成器GUI中输入的文本将在运行时由NSFetchRequest替换:fetchRequestFromTemplateWithName:substitutionVariables:?
谢谢!
伍迪
cocoa core-data data-modeling nspredicateeditor nsfetchrequest
场景:
比方说,我有一个名为实体,Author即有一个叫做一对多关系books的Book实体(反向关系author).如果我有一个现有的Author对象集合,我想books在一个获取请求中为所有这些对象的关系出错.
码
这是我到目前为止所尝试的:
NSArray *authors = ... // array of `Author` objects
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Book"];
fetchRequest.returnsObjectsAsFaults = NO;
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"author IN %@", authors];
Run Code Online (Sandbox Code Playgroud)
执行此获取请求不会导致数组中books对象的关系authors出现故障(通过日志记录进行检查).
我也试过反过来做提取请求:
NSArray *authors = ... // array of `Author` objects
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Author"];
fetchRequest.returnsObjectsAsFaults = NO;
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", authors];
fetchRequest.relationshipKeypathsForPrefetching = @[@"books"];
Run Code Online (Sandbox Code Playgroud)
这也不会引发故障.这样做的恰当方式是什么?
我希望能够使用IN子句搜索实体的关系.我有以下设置:

我想发送一系列昵称,找到与这些昵称相关的所有人.
//array of names to find
let nameArray: [String] = ["Tom", "Tommy", "Thomas"]
// find all Persons who have a nickname associated with that person
let predicate = NSPredicate(format: "ANY Person.nickName in %@",nameArray)
var fetch = NSFetchRequest(entityName: "Person")
fetch.predicate = predicate
var fetchError : NSError? = nil
// executes fetch
let results = context?.executeFetchRequest(fetch, error: &fetchError)
Run Code Online (Sandbox Code Playgroud)
但是当我运行代码时,我收到以下错误:
'NSInvalidArgumentException',原因:'谓词的未实现的SQL生成:(任何Person.nickName IN {"Tom","Tommy","Thomas"})'
我在这做错了什么?如果我删除谓词搜索,它会返回所有结果,但是一旦我添加了这一行,一切都会中断.
我有一个项目,我需要做一个获取请求,获取核心数据实体的最新"更新"日期.当我实际检查查询返回的结果时,我看到一些相当奇怪的行为.除了包含日期的"正确"结果外,结果还包括空字典项.无论基础数据是什么样的,每次都会发生这种情况.更奇怪的是,如果我打开xcode中的sql登录并对sqllite db执行记录查询,它会生成正确的结果而没有额外的条目.我不太确定我在这里做错了什么,任何帮助都会受到赞赏.
构建和执行查询的函数:
func queryForContactDate(context:NSManagedObjectContext) -> AnyObject?
{
var expressionDescriptions = [AnyObject]();
let expressionDescription = NSExpressionDescription()
// Name the column
expressionDescription.name = "maxUpdated"
// Use an expression to specify what aggregate action we want to take and
// on which column. In this case max on the update_at column
expressionDescription.expression = NSExpression(format: "@max.updated_at")
// Specify the return type we expect
expressionDescription.expressionResultType = .DateAttributeType
// Append the description to our array
expressionDescriptions.append(expressionDescription)
// Build out our fetch request the usual way …Run Code Online (Sandbox Code Playgroud) 我将联系人tableview控制器中的联系人标识符传递给另一个位置tableview控制器.所以我定义一个委托ContactSelectionDelegate并在Location tableview控制器中实现方法userSelectedContact并获取contactIdentifierString
我正在搜索数据库以查找contactIdentifierString的匹配项,并查找另一个属性提供程序名称的值.这涉及搜索整个数据库.通过为上下文fetchRequest分配谓词是否有更快的方法.我认为这将更快,更少的代码行.
有人可以建议如何使用联系人fetchRequest来使用谓词吗?
ContactTableViewController代码:
protocol ContactSelectionDelegate{
func userSelectedContact(contactIdentifier:NSString)
}
class ContactTableViewController: UITableViewController {
var delegate:ContactSelectionDelegate? = nil
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if (delegate != nil){
let contactDict:NSDictionary = allContacts.object(at: indexPath.row) as! NSDictionary
let identifier = contactDict.object(forKey: "uniqueId")
delegate!.userSelectedContact(contactIdentifier: identifier as! NSString)
self.navigationController!.popViewController(animated: true)
}
}
Run Code Online (Sandbox Code Playgroud)
}
LocationTableViewController代码:
class LocationTableViewController: UITableViewController, ContactSelectionDelegate, CLLocationManagerDelegate {
var contactIdentifierString:NSString = NSString()
func userSelectedContact(contactIdentifier: NSString) {
var fetchedResults: [Contact] = []
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
do { …Run Code Online (Sandbox Code Playgroud) 我有一个视图,显示团队中使用@Fetchrequest和固定谓词“开发人员”过滤的消息。
struct ChatView: View {
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Message.createdAt, ascending: true)],
predicate: NSPredicate(format: "team.name == %@", "Developers"),
animation: .default) var messages: FetchedResults<Message>
@Environment(\.managedObjectContext)
var viewContext
var body: some View {
VStack {
List {
ForEach(messages, id: \.self) { message in
VStack(alignment: .leading, spacing: 0) {
Text(message.text ?? "Message text Error")
Text("Team \(message.team?.name ?? "Team Name Error")").font(.footnote)
}
}...
Run Code Online (Sandbox Code Playgroud)
我想使该谓词动态化,以便在用户切换团队时显示该团队的消息。下面的代码给我以下错误
无法在属性初始化程序中使用实例成员'teamName';属性初始化程序在“自我”可用之前运行
struct ChatView: View {
@Binding var teamName: String
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Message.createdAt, ascending: true)],
predicate: NSPredicate(format: "team.name == %@", teamName), …Run Code Online (Sandbox Code Playgroud) 背景 - 批处理不存在:
NSFetchRequest允许批量处理 - 例如,使用1000个结果的查询,它会将所有作为错误,然后它将一次解除X对象(即索引0-20,然后是21-40等)
当在NSFetchResultsController中用于UITableViewDataSource时,此行为非常好,并且它允许快速UI滚动,因为它不会逐个地解除对象.
现在我的问题:
我正在使用有序关系列表中的对象,让我们说帖子.
由于Post可能会出现在我模型的很多列表中,因此我无法将其索引存储在Post实体的每个列表中,并将其用作排序结果的参数.
至于现在,我还没有找到NSFetchRequest按照这个顺序获取的方法,所以我不能使用它的批量不存在.所以我正在解决与索引的关系,我最终逐个取消,这会导致颠簸滚动.
NSFetchResultsController是否有任何方法可以根据订单关系获取?或者,是否存在批量不支持的API,它不是私有的?
core-data fault nsfetchedresultscontroller nsfetchrequest ios
所以我不会埋没lede,我将打开我的核心问题:为什么我的NSFetchedResultsController的fetchedObjects数组通常是同类的,但在极少数情况下包含__NSCFString它应该包含的托管对象?
我有一个应用程序已经生产了很长一段时间.它的主要视图是一个表视图,其中包含由核心数据管理对象支持的视频列表.表视图控制器使用NSFetchedResultsController配置相当普通的NSFetchRequest:
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:[ABCVideo entityName]];
NSString *sectionKeyPath = nil;
request.fetchBatchSize = 20;
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:ABCVideoAttributes.recordingDate ascending:NO];
sectionKeyPath = @"sectionIdentifier";
request.sortDescriptors = @[sort];
request.predicate = [NSPredicate predicateWithFormat:@"owner = %@ and %K = %@", person, ABCVideoAttributes.serverDeleted, @(NO)];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:moc sectionNameKeyPath:sectionKeyPath cacheName:kABCMyVideosTableViewControllerCacheKey];
Run Code Online (Sandbox Code Playgroud)
由于这些视频可以上传到云端,因此该表格视图控制器会偶尔收到通知,以更新与当前正在上传的视频对应的表格视图单元格中的进度条.在这个回调中,我们得到NSFetchedResultsController的fetchedObjects数组用于查找与通知相对应的视频,以便正确的表格视图单元格可以更新其进度条.
这一切都有效.99.9%的时间,它每次都有效</RonBurgundy>.
但我注意到在我们的HockeyApp崩溃报告中,有一种罕见的,罕见的情况,当我的通知处理程序试图filteredArrayUsingPredicate从以下位置获取时,我收到SIGABRT fetchedObjects:
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSCFString 0x136f24480> …
core-data objective-c nsfetchedresultscontroller nsfetchrequest ios
所以......我有一个启用了 StoreData 和 iCloud 的应用程序。我的数据正在设备之间同步,但在反映 UI 中的更改时,我没有得到我想要的行为。
我想要的行为:当用户在两个设备(A 和 B)上打开我的应用程序并对其中一个(A)进行更改时,我希望更改在合理的时间内自动反映在第二个(B)设备 UI 中.
我目前的行为:当用户在一台设备 (A) 上进行更改时,另一台设备 (B) 上什么也没有发生……直到我最小化和最大化第二台设备 (B) 上的应用程序(不重新启动……只是最小化)。
我的想法是,在最小化和重新打开应用程序时触发某些操作之前,应用程序不会收到更改(iCloud 不会同步)。
但我不知道。根据Syncing a Core Data Store with CloudKit同步和通知其他设备应该自动发生。而且我认为我的 View 应该正确连接,因为在对 CoreData 数据库中的数据进行本地更改时它会立即更改。
我的 SwiftUI 视图几乎如下所示:
import SwiftUI
import CloudKit
import Foundation
struct MyView: View {
@FetchRequest(fetchRequest: Entity.fetchRequest() as! NSFetchRequest<Entity>) var entities: FetchedResults<Entity>
var body: some View {
List {
ForEach(entities, id: \.id) { e in
Text("\(e.title)")
}
}
}
}
public class Entity: …Run Code Online (Sandbox Code Playgroud) core-data ×10
nsfetchrequest ×10
ios ×4
swift ×4
cocoa ×2
nspredicate ×2
objective-c ×2
swiftui ×2
fault ×1
icloud ×1
ios10 ×1
swift3 ×1