标签: nsfetchrequest

NSSortdescriptor 对从 NSManagedContext 获取结果无效

我正在尝试使用 NSSortdescriptor 使用指向 NSDate 值的键对 NSFetchRequest 结果进行排序。我的获取结果完全随机,没有明确的原因。

我正在使用的 NSManagedObjectContext 是通过在 NSOperation 子类上创建的嵌套子上下文中保存的内容进行更新的。我知道这一切都成功完成,因为我可以从父(主)上下文获取所需的所有数据。从它获取只是不会按日期排序!

奇怪的是;用于选择两个日期之间的实体(称为“推文”)的谓词效果很好!

这是一些代码来说明我的问题:

NSSortDescriptor* timeDescriptor = [NSSortDescriptor
                                        sortDescriptorWithKey:@"time"
                                        ascending:NO
                                        selector:@selector(compare:)];

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Tweet"];
[request setSortDescriptors:[NSArray arrayWithObjects:timeDescriptor, nil]];

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"((time >= %@) AND (time <= %@))",startDate,endDate];
[request setPredicate:predicate];

NSManagedObjectContext* context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setParentContext:[[NSApp delegate] managedObjectContext]];
[context performBlock:^{
    NSError* error = nil;
    NSArray* results = nil;

    results = [context executeFetchRequest:request error:&error];
    // Results here are not ordered correctly

    // 2nd try sorting results …
Run Code Online (Sandbox Code Playgroud)

objective-c nsdate nssortdescriptor nsfetchrequest

5
推荐指数
2
解决办法
1392
查看次数

NSFetchRequest 总和、分组依据和排序

在我的应用程序中,我试图列出四种最受欢迎​​的产品。
产品受欢迎程度由订单总量决定。

下面的查询是为了说明我想要做什么:

SELECT     TOP 4  SUM(quantity) as sumQuantity, Product
FROM       [Order]
GROUP BY   Product
ORDER BY   1 DESC
Run Code Online (Sandbox Code Playgroud)

下面的代码是我在针对核心数据模型的获取请求中获取它的方法:

// Create an expression to sum the order quantity
NSExpressionDescription *sumExpression = [[NSExpressionDescription alloc] init];
sumExpression.name = @"sumQuantity";
sumExpression.expression = [NSExpression expressionWithFormat:@"@sum.%K", OrderAttributes.quantity];
sumExpression.expressionResultType = NSInteger32AttributeType;

// Create the fetch request
NSFetchRequest *request = [Order createFetchRequest];
request.resultType = NSDictionaryResultType;
request.propertiesToFetch = @[OrderRelationships.product, sumExpression];
request.propertiesToGroupBy = @[OrderRelationships.product];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:sumExpression.name ascending:NO]];
request.fetchLimit = 4;
Run Code Online (Sandbox Code Playgroud)

我的问题是 sortDescriptor,它似乎只允许 Order 的直接属性(应用程序例外)。
排序非常重要,因为它决定将返回哪四个记录。

注意:我正在使用 …

sorting group-by core-data objective-c nsfetchrequest

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

评估谓词中的 CoreData 实体类型

我有一个我精心设计的块谓词,只是为了发现你不能在核心数据中使用它们。

NSPredicate *rootContactPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

        BOOL isPersonAndRoot = ([[[evaluatedObject entity] name] isEqualToString:@"Person"] && [[(Person*)evaluatedObject accounts] count] == 0);
        BOOL isAccountAndRoot = ([[[evaluatedObject entity] name] isEqualToString:@"Account"] && [(Account*)evaluatedObject root] == nil);

        return isPersonAndRoot || isAccountAndRoot;
    }];
Run Code Online (Sandbox Code Playgroud)

所以我需要将其转换为标准字符串格式谓词,但我不清楚如何检查评估对象的实体类型。和实体是实体的子类,该Person实体是在获取请求中评估的类型。我希望它能看到子类型。AccountContact

core-data nspredicate nsfetchrequest

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

更改 NSFetchedResultsController 的 fetchRequest.predicate 不会触发委托

NSPredicate我的 FRC 上有一个fetchRequest。在某个时刻,一个对象被添加到 CoreData,我创建一个新谓词,更新fetchRequest并执行获取:

self.fetchedAddressesController.fetchRequest.predicate = self.predicate;
BOOL success = [self.fetchedAddressesController performFetch:nil];
Run Code Online (Sandbox Code Playgroud)

然而,这不会调用 FRC 的委托方法,例如controllerWillChangeContent:. 而且我的表视图没有更新。

但是,当我添加以下行时:

[self.tableView reloadData];
Run Code Online (Sandbox Code Playgroud)

在上面显示的两个下方,我确实看到了预期的更新。这说明要显示的数据确实发生了变化。

我检查了新的谓词,没有问题。我还将 FRC 设置delegateself,并且在其他情况下调用其方法。

已经有什么想法可能是错的吗?

objective-c nsfetchedresultscontroller nsfetchrequest ios

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

SwiftUI 中的 FetchRequest 包装值:EXC_BAD_INSTRUCTION

我正在尝试TrainingSessionHistory在我的 SwiftUI 视图之一中对我的(核心数据对象)进行简单的获取请求,但得到了Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

struct TrainingHistoryView: View {

var trainingSession  : TrainingSession

init(trainingSession : TrainingSession) {
    self.trainingSession = trainingSession

    let fetchRequest = FetchRequest(fetchRequest: TrainingSessionHistory.getBy(nb: 2, myTrainingSession: self.trainingSession))
    print(fetchRequest.wrappedValue) // -> crash this EXC_BAD_INSTRUCTION

}
Run Code Online (Sandbox Code Playgroud)

TrainingSessionHistoryExtension : 创建获取请求

static func getBy(nb : Int, myTrainingSession : TrainingSession) -> NSFetchRequest<TrainingSessionHistory>{
    let request:NSFetchRequest<TrainingSessionHistory> = TrainingSessionHistory.fetchRequest() as!    NSFetchRequest<TrainingSessionHistory>

    //request.predicate = NSPredicate(format: "trainingSession == %@", myTrainingSession)
    request.fetchLimit = nb

    let sortDescriptor = NSSortDescriptor(key: "date", ascending: true)

    request.sortDescriptors = [sortDescriptor]

    return …
Run Code Online (Sandbox Code Playgroud)

core-data nsfetchrequest swift swiftui

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

如何避免更改 NSBatchInsertRequest 中的属性值?

我有一个简单的核心数据实体Story,偶尔会使用网络调用中的最新数据进行更新。此网络调用有时会更新很多很多故事实例,因此我运行一个NSBatchInsertRequest,如下所示。(我使用批量插入的另一个原因是可能需要将许多故事添加到持久存储中。)

问题是用户可能已经将 a 标记Story为收藏夹。当他们这样做时,我设置story.isFavorite = true主线程并保存viewContext

但是,当发生批量插入时,它会覆盖story.isFavorite,将其设置回false,即使我NSMergeByPropertyObjectTrumpMergePolicy同时在批量插入和视图上下文中使用。我也没有接触story.isFavorite批量插入处理程序,因此我不希望该属性被覆盖。

我认为使用此合并策略进行批量插入的好处是避免首先获取+然后手动更新更改的属性+最后保存。避免更改 中的属性值的正确方法是什么NSBatchInsertRequest

故事

@objc(Story)
public class Story: NSManagedObject {

    @NSManaged public var title:       String?
    @NSManaged public var storyURL:    URL?
    @NSManaged public var updatedTime: Date?
    @NSManaged public var isFavorite:  Bool // <- the problem property
}
Run Code Online (Sandbox Code Playgroud)

批量插入

container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
container.viewContext.automaticallyMergesChangesFromParent = false

let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
context.parent = container.viewContext
context.mergePolicy = …
Run Code Online (Sandbox Code Playgroud)

core-data nsfetchedresultscontroller nsfetchrequest nsmanagedobject nsmanagedobjectcontext

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

如何获取按计算值排序的托管对象

我正在使用使用CoreData的应用程序.存在包含纬度和经度值的位置实体.我想获取按距离排序到用户位置的实体.我试图将排序描述符设置为距离公式sqrt((x1 - x2)^ 2 +(y1 - y2)^ 2)但是它失败,异常"... keypath ...在实体中找不到".

NSString *distanceFormula = [NSString stringWithFormat:@"sqrt(((latitude - %f) * (latitude - %f)) + ((longitude - %f) * (longitude - %f)))", 
                            location.coordinate.latitude, 
                            location.coordinate.latitude, 
                            location.coordinate.longitude, 
                            location.coordinate.longitude];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:distanceFormula ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
NSError *error;
NSArray *result = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
Run Code Online (Sandbox Code Playgroud)

我想获取已经排序的对象,而不是全部获取它们然后在代码中排序.

任何提示赞赏.

iphone core-data objective-c nsfetchrequest

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

核心数据:通过特定属性获取(加入关系)

我有一个核心数据模型如下

替代文字

attributes物业Page是一组DictionaryEntry,他们是我的Page对象的值,很像一个标准NSDictionary(除了所有的keysvalues都是字符串)

我有一个Page具有DictionaryEntrykey="title"value="Home".我如何形成一个获取请求来加载该特定页面?

iphone macos core-data nsfetchrequest

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

使用CoreData执行乘法(聚合):如何?

Jeff Lamarche的精彩教程之后,我正在尝试聚合特定子类的数据NSManagedObject.

这就是场景.我创建了一个名为Product扩展NSManagedObject类的类.Productclass有三个属性,如下所示:

@property (nonatomic, retain) NSString* name;
@property (nonatomic, retain) NSNumber* quantity;
@property (nonatomic, retain) NSNumber* price;
Run Code Online (Sandbox Code Playgroud)

我还创建了一个名为的类别,Product+Aggregate我执行总和聚合.特别是,按照Jeff教程,我管理了数量属性的总和.

+(NSNumber *)aggregateOperation:(NSString *)function onAttribute:(NSString *)attributeName withPredicate:(NSPredicate *)predicate inManagedObjectContext:(NSManagedObjectContext *)context
{
    NSString* className = NSStringFromClass([self class]);

    NSExpression *ex = [NSExpression expressionForFunction:function 
        arguments:[NSArray arrayWithObject:[NSExpression expressionForKeyPath:attributeName]]];

    NSExpressionDescription *ed = [[NSExpressionDescription alloc] init];
    [ed setName:@"result"];
    [ed setExpression:ex];
    [ed setExpressionResultType:NSInteger64AttributeType];

    NSArray *properties = [NSArray arrayWithObject:ed];
    [ed release];

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request …
Run Code Online (Sandbox Code Playgroud)

core-data nsfetchrequest nsmanagedobject nsmanagedobjectcontext ios

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

"使用带有swift 3.0的NSFetchRequest()时,无法推断通用参数'ResultType'

当我将我的项目转换为swift 3.0时,我发现了错误

无法推断参数'ResultType'

我的代码是这样的:

let fetchRequest = NSFetchRequest(entityName: "Book")
Run Code Online (Sandbox Code Playgroud)

我之前在我的项目中使用此代码,现在它出现错误.如何我正确地修改它.

core-data nsfetchrequest ios swift

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