标签: nsfetchrequest

核心数据 - NSPredicate可过滤多对多关系

我有2个实体,任务和列表.每个任务与一个名为"list"的List对象具有一对一的关系,并且与List有一个反向关系,它与Task有一个to-many关系,称为"tasks".

我正在尝试使用带有NSPredicate的获取请求来获取属于指定List的所有Task对象:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"list=%@", theList];
[fetchRequest setPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)

(其中"theParent"是对List对象的引用).但是,这不会返回任何提取的对象.如果我取出谓词,那么返回对象(所以我知道它们存在,并且通过NSLogging theList我知道它有与之关联的Task对象).

谢谢

iphone cocoa-touch core-data nspredicate nsfetchrequest

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

从核心数据实体获取属性值数组的有效方法是什么?

考虑以下:

NSFetchRequest *request = [[NSFetchRequest Alloc] init];
request.entity = [NSEntityDescription entityWithName:@"Person" inContext:_MOC];
request.propertiesToFetch = [NSArray arrayWithObject:@"Name"];
NSError *error = nil;
NSArray *results = [_MOC executeFetchRequest:request error:&error];
Run Code Online (Sandbox Code Playgroud)

这将返回一个Person对象数组.我想要的是Person.name来自这些对象的值数组.目前我走结果数组,提取名称并构建一个新数组.有更清洁,更快的方法吗?我已经考虑过改变request.resultType,NSDictionaryResultType但这并没有太大的收获,因为我仍然需要将字典数组转换为我需要的数组.

我已经实现了上面的解决方案,所以真的在寻找更好的方法.如果正确答案是"没有更好的方法"那就没关系,只要确保我没有错过任何东西.谢谢!

编辑:在考虑这个问题时,我质疑我需要一个值数组而不仅仅是使用托管对象数组.在任何情况下,如果那里有一个,仍然会很感激.

core-data nsfetchrequest nsmanagedobject ios

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

如何知道NSPredicate中抽象实体的类类型?

使用核心数据我想获取一些数据.我的模型使用了一些抽象实体,参见附图,其中QuantifiedIngredient是一个抽象类.我想获取至少有一个RecipeQuantifiedIngredients的Ingredient实体,但中间是QuantifiedIngredient,这是一个抽象类.

我该怎么做,如何在NSPredicate中测试抽象类的实际类型?有什么想法或建议吗?

在此输入图像描述

我发现的唯一线索是: 如何在谓词中引用父实体的获取请求中的子实体名称?

可以在我的QuantifiedIngredient中使用自定义属性来知道它是否是RecipeQuantifiedIngredient?例如isRecipeQuantifiedIngredient?

非常感谢你的帮助.

core-data nspredicate nsfetchrequest ios5

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

iOS:NSPredicate使用NSDate进行比较

我有一个NSDate名为startDate存储在持久性存储中的属性,格式如下(下图).

在此输入图像描述

426174354 = 2014年7月4日

我需要NSFetchRequest使用谓词创建(3).

用于startDate:

  1. fetchRequest1 使用谓词需要根据用户的设备时间获取当前日期的所有内容.
  2. fetchRequest2 使用谓词需要根据用户的设备时间获取过去的所有内容,即昨天和之前的内容.
  3. fetchRequest3 使用谓词需要获取将来的所有内容,即根据用户的设备时间明天和之后开始.

以下是我到目前为止的代码:

-(NSMutableArray *)getFetchPredicate:(NSUInteger)fetchRequestType
{
    NSDate *now = [self getcurrentTime:[NSDate date]];
    NSDateFormatter *format = [[NSDateFormatter alloc] init];
    format.dateFormat = @"dd-MM-yyyy";
    format.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    NSString *stringDate = [format stringFromDate:now];
    NSDate *todaysDate = [format dateFromString:stringDate];
    //today's date is now a date without time. 

    NSMutableArray *subpredicates;

    if (fetchRequestType == 1)
    {
        NSPredicate *subPredToday = [NSPredicate predicateWithFormat:@"startDate == %@ ", todaysDate];
        [subpredicates addObject:subPredToday];
    } …
Run Code Online (Sandbox Code Playgroud)

nsdate nspredicate nsfetchrequest ios ios7

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

案例不敏感与核心数据和Swift的比较

以下代码不起作用:

let sortDescriptor = NSSortDescriptor(key: "name", ascending: true, selector:"caseInsensitiveCompare")
Run Code Online (Sandbox Code Playgroud)

并给出以下错误:'NSInvalidArgumentException',原因:'不支持的NSSortDescriptor选择器:caseInsensitiveCompare'

似乎在Objective-C中工作正常.关于为什么会这样的任何想法?

编辑:看起来这可能与Core Data/SQLite无法实现.在这种情况下,获取数组并在之后的代码中对其进行排序是最好的选择吗?

core-data nsfetchrequest ios swift

9
推荐指数
3
解决办法
4316
查看次数

在 swiftUI 视图模型中使用 FetchRequest

我正在尝试在 swiftUI 中遵循 MVVM 模式,但遇到了核心数据和获取请求的问题。我看过的所有视频和我读过的文章,在视图中都有一个@FetchRequest,用于访问和修改核心数据。我如何将它放在 SettingsVCModel 中?我似乎无法弄清楚,因此我将获取请求保留在视图结构(SettingsVC)中并在那里使用它。然而,到目前为止,这是使用按钮,您可以在其中执行操作。现在我需要用一个切换来完成它,它只有一个与之关联的绑定变量,没有像按钮那样的动作。我在 SettingsVCModel 内的 @Published bio 上尝试了 didSet 方法,但他们无权访问获取请求。任何帮助将不胜感激。我正在使用的代码如下。

struct SettingsVC: View {
    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(fetchRequest: UserSettings.getUserSettings()) var userSettings : FetchedResults<UserSettings>
    @ObservedObject var model = SettingsVCModel()

    var body: some View {
        NavigationView {
            Form{
                Section(header: Text("Application")){
                    Toggle(isOn: $model.bio, label: {Text(model.determineBiometricType())})
                    Picker(selection: $model.unitSelection, label: Text("Units")) {
                        Text("Imperial").tag(0)
                        Text("Metric").tag(1)
                    }
                    SettingsButton(toggleButton: $model.openSettings, title: "System Authorizations")
                }
                Section(header: Text("Feedback")){
                    NavigationLink(destination: ContactVC()){
                        Text("Contact Me")
                    }
                    SettingsButton(toggleButton: $model.rateApp, title: "Please Rate Body Insights")
                    SettingsButton(toggleButton: $model.tellAFriend, title: "Tell a Friend") …
Run Code Online (Sandbox Code Playgroud)

core-data nsfetchrequest swift

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

核心数据性能:NSPredicate比较对象

如果我的Author NSManagedObject模型有一个authorID属性(由服务器确定),NSFetchRequest如果NSPredicate过滤器authorID而不是完整Author对象,那么效果会更好吗?让我们说我正在取得所有Book NSManagedObject的东西author.哪个predicateFormat更好?

[NSPredicate predicateWithFormat:@"author = %@", anAuthor]
Run Code Online (Sandbox Code Playgroud)

要么

[NSPredicate predicateWithFormat:@"author.authorID = %@", anAuthor.authorID]
Run Code Online (Sandbox Code Playgroud)

对此进行分析的最佳方式是什么?我使用OCUnit(SenTestingKit)进行核心数据测试.iOS有像Ruby的Benchmark模块吗?

profile performance core-data nspredicate nsfetchrequest

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

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

场景:

比方说,我有一个名为实体,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
查看次数

在NSManagedObjectSubclass上通过Swift Computed属性对NSFetchedResultsController进行排序

我正在使用Swift和Core Data构建一个应用程序.在我的应用程序的某一点上,我想要UITableView显示当前在持久存储中的所有类型的对象.目前,我正在检索它们并使用表格在表格视图中显示它们NSFetchedResultsController.我希望表视图按我的NSManagedObject子类的计算属性排序,如下所示:

class MHClub: NSManagedObject{
@NSManaged var name: String
@NSManaged var shots: NSSet
var averageDistance: Int{
    get{
        if shots.count > 0{
            var total = 0
            for shot in shots{
                total += (shot as! MHShot).distance.integerValue
            }
            return total / shots.count
        }
        else{
            return 0
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的表视图控制器,我建立我NSFetchedResultsControllerfetchRequest如下:

let request = NSFetchRequest(entityName: "MHClub")
request.sortDescriptors = [NSSortDescriptor(key: "averageDistance", ascending: true), NSSortDescriptor(key: "name", ascending: true)]
Run Code Online (Sandbox Code Playgroud)

像这样设置会导致我的应用程序崩溃,并在日志中显示以下消息:

'NSInvalidArgumentException', reason: 'keypath averageDistance not found in …
Run Code Online (Sandbox Code Playgroud)

sorting core-data nsfetchrequest ios swift

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

SwiftUI FetchRequest 和 onReceive 导致无限循环

我在 swiftUI 中有一个用于 NSManagedObject 的 @FetchRequest。当使用切换时,我试图通过调用 onReceive 来更改核心数据中第一项的标题。这,如果获取的成果在MainVC使用工作。为了证明这一点,导航按钮标题是获取的结果中有多少元素。这最终会在 ContentView onRecieve 方法中创建一个无限循环。如果导航按钮具有常规文本而不是使用 FetchedResults 中的任何内容,则没有循环,一切都按预期工作。这个循环是如何引起的,是否有更好的方法来切换特定的核心数据元素?

import SwiftUI
import CoreData

final class ContentVCModel : ObservableObject{
    @Published var newToDoItem = String()
    @Published var shouldTurnOn = false

    func createNewToDoItem(){
        let moc = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

        let toDoItem = ToDoItem(context: moc)
        toDoItem.title = self.newToDoItem
        toDoItem.createdAt = Date()
        toDoItem.cost = Cost(main: "$\(Int.random(in: 1...99))", tax: "$\(Int.random(in: 1...9))")
        toDoItem.isOn = false

        ToDoItem.save()
        self.newToDoItem = ""
    }
}

struct ContentView: View {
    @ObservedObject var model = ContentVCModel()
    @Environment(\.managedObjectContext) …
Run Code Online (Sandbox Code Playgroud)

loops core-data nsfetchrequest swiftui

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