我有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对象).
谢谢
考虑以下:
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但这并没有太大的收获,因为我仍然需要将字典数组转换为我需要的数组.
我已经实现了上面的解决方案,所以真的在寻找更好的方法.如果正确答案是"没有更好的方法"那就没关系,只要确保我没有错过任何东西.谢谢!
编辑:在考虑这个问题时,我质疑我需要一个值数组而不仅仅是使用托管对象数组.在任何情况下,如果那里有一个,仍然会很感激.
使用核心数据我想获取一些数据.我的模型使用了一些抽象实体,参见附图,其中QuantifiedIngredient是一个抽象类.我想获取至少有一个RecipeQuantifiedIngredients的Ingredient实体,但中间是QuantifiedIngredient,这是一个抽象类.
我该怎么做,如何在NSPredicate中测试抽象类的实际类型?有什么想法或建议吗?

我发现的唯一线索是: 如何在谓词中引用父实体的获取请求中的子实体名称?
可以在我的QuantifiedIngredient中使用自定义属性来知道它是否是RecipeQuantifiedIngredient?例如isRecipeQuantifiedIngredient?
非常感谢你的帮助.
我有一个NSDate名为startDate存储在持久性存储中的属性,格式如下(下图).

426174354 = 2014年7月4日
我需要NSFetchRequest使用谓词创建(3).
用于startDate:
fetchRequest1 使用谓词需要根据用户的设备时间获取当前日期的所有内容.fetchRequest2 使用谓词需要根据用户的设备时间获取过去的所有内容,即昨天和之前的内容.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) 以下代码不起作用:
let sortDescriptor = NSSortDescriptor(key: "name", ascending: true, selector:"caseInsensitiveCompare")
Run Code Online (Sandbox Code Playgroud)
并给出以下错误:'NSInvalidArgumentException',原因:'不支持的NSSortDescriptor选择器:caseInsensitiveCompare'
似乎在Objective-C中工作正常.关于为什么会这样的任何想法?
编辑:看起来这可能与Core Data/SQLite无法实现.在这种情况下,获取数组并在之后的代码中对其进行排序是最好的选择吗?
我正在尝试在 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) 如果我的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模块吗?
场景:
比方说,我有一个名为实体,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)
这也不会引发故障.这样做的恰当方式是什么?
我正在使用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)
在我的表视图控制器,我建立我NSFetchedResultsController的fetchRequest如下:
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) 我在 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) nsfetchrequest ×10
core-data ×9
ios ×4
nspredicate ×4
swift ×3
cocoa-touch ×1
ios5 ×1
ios7 ×1
iphone ×1
loops ×1
nsdate ×1
objective-c ×1
performance ×1
profile ×1
sorting ×1
swiftui ×1