标签: nsfetchrequest

核心数据:尝试查找实体中属性的最小日期

我正在尝试在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)

cocoa core-data nsfetchrequest

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

使用存储在CoreData模型中的FetchRequests进行变量替换

我总是在代码中创建我的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

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

批处理对象集合的多对多关系

场景:

比方说,我有一个名为实体,Author即有一个叫做一对多关系booksBook实体(反向关系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)

这也不会引发故障.这样做的恰当方式是什么?

core-data objective-c nsfetchrequest

8
推荐指数
0
解决办法
595
查看次数

核心数据NSPredicate使用in子句获取实体关系

我希望能够使用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"})'

我在这做错了什么?如果我删除谓词搜索,它会返回所有结果,但是一旦我添加了这一行,一切都会中断.

core-data nspredicate nsfetchrequest ios swift

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

Swift获取请求返回结果中的空项

我有一个项目,我需要做一个获取请求,获取核心数据实体的最新"更新"日期.当我实际检查查询返回的结果时,我看到一些相当奇怪的行为.除了包含日期的"正确"结果外,结果还包括空字典项.无论基础数据是什么样的,每次都会发生这种情况.更奇怪的是,如果我打开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)

core-data aggregate-functions nsfetchrequest swift

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

如何在Core Data中使用带有fetchRequest的谓词

我将联系人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)

core-data nsfetchrequest ios swift3 ios10

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

SwiftUI View和@FetchRequest谓词具有可以更改的变量

我有一个视图,显示团队中使用@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)

core-data nspredicate nsfetchrequest swift swiftui

8
推荐指数
6
解决办法
816
查看次数

CoreData有序关系 - 使用NSFetchRequest批量取消

背景 - 批处理不存在:
NSFetchRequest允许批量处理 - 例如,使用1000个结果的查询,它会将所有作为错误,然后它将一次解除X对象(即索引0-20,然后是21-40等)

当在NSFetchResultsController中用于UITableViewDataSource时,此行为非常好,并且它允许快速UI滚动,因为它不会逐个地解除对象.

现在我的问题:
我正在使用有序关系列表中的对象,让我们说帖子.

由于Post可能会出现在我模型的很多列表中,因此我无法将其索引存储在Post实体的每个列表中,并将其用作排序结果的参数.

至于现在,我还没有找到NSFetchRequest按照这个顺序获取的方法,所以我不能使用它的批量不存在.所以我正在解决与索引的关系,我最终逐个取消,这会导致颠簸滚动.

NSFetchResultsController是否有任何方法可以根据订单关系获取?或者,是否存在批量不支持的API,它不是私有的?

core-data fault nsfetchedresultscontroller nsfetchrequest ios

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

为什么NSFetchedResultsController的fetchedObjects数组并不总是同质的

所以我不会埋没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)

由于这些视频可以上传到云端,因此该表格视图控制器会偶尔收到通知,以更新与当前正在上传的视频对应的表格视图单元格中的进度条.在这个回调中,我们得到NSFetchedResultsControllerfetchedObjects数组用于查找与通知相对应的视频,以便正确的表格视图单元格可以更新其进度条.

这一切都有效.99.9%的时间,它每次都有效</RonBurgundy>.

但我注意到在我们的HockeyApp崩溃报告中,有一种罕见的,罕见的情况,当我的通知处理程序试图filteredArrayUsingPredicate从以下位置获取时,我收到SIGABRT fetchedObjects:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSCFString 0x136f24480> …

core-data objective-c nsfetchedresultscontroller nsfetchrequest ios

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

如何在 SwiftUI 视图中自动反映 CoreData+iCloud 变化?

所以......我有一个启用了 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 nsfetchrequest icloud swift swiftui

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