标签: nsfetchrequest

核心数据模式:如何通过网络变化有效地更新本地信息?

我的应用程序效率低下,我想了解并修复.

我的算法是:

fetch object collection from network
for each object:
  if (corresponding locally stored object not found): -- A
    create object
    if (a nested related object locally not found): -- B
      create a related object
Run Code Online (Sandbox Code Playgroud)

我正在通过使用相关对象的键创建谓词查询来检查A行和B行,该键是我的模式的一部分.我看到A(总是)和B(如果执行分支到该部分)生成一个SQL选择,如:

2010-02-05 01:57:51.092 app[393:207] CoreData: sql: SELECT <a bunch of fields> FROM ZTABLE1 t0 WHERE  t0.ZID = ? 
2010-02-05 01:57:51.097 app[393:207] CoreData: annotation: sql connection fetch time: 0.0046s
2010-02-05 01:57:51.100 app[393:207] CoreData: annotation: total fetch execution time: 0.0074s for 0 rows.
2010-02-05 01:57:51.125 app[393:207] CoreData: …
Run Code Online (Sandbox Code Playgroud)

iphone performance core-data nsfetchrequest cocoa-design-patterns

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

更改为NSFetchedResultsController后,UITableView不更新DataSource

我有一个UITableView人口NSFetchedResultsController.初始提取工作正常.我可以添加,删除,修改等零问题.但我想在表中添加用户定义的排序.我这样做是通过改变NSFetchedResultsController使用不同的sortDescriptor设置和不同的设置sectionNameKeyPath.这是我更改提取的代码:

-(void)changeFetchData {
    fetchedResultsController = nil;

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    NSString *sortKey = @"sortKey";
    NSString *cacheName = @"myNewCache";
    BOOL ascending = YES;

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortKey ascending:ascending];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:sortKey cacheName:nil];
    self.fetchedResultsController = aFetchedResultsController;
    fetchedResultsController.delegate = self;

    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor release];
    [sortDescriptors …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c uitableview nsfetchedresultscontroller nsfetchrequest

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

使用Core Data高效显示100,000个项目

我使用NSFetchResultsController在UITableView中显示100,000 +记录.这有效,但它很慢,特别是在iPad 1上.加载可能需要7秒钟,这对我的用户来说是一种折磨.

我也希望能够使用部分,但这至少会增加3秒的时间.

这是我的NSFetchResultsController:

- (NSFetchedResultsController *)fetchedResultsController {

    if (self.clientsController != nil) {
        return self.clientsController;
    }

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:self.managedObjectContext];
    [request setEntity:entity];
    [request setPredicate:[NSPredicate predicateWithFormat:@"ManufacturerID==%@", self.manufacturerID]];
    [request setFetchBatchSize:25];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc]  initWithKey:@"UDF1" ascending:YES];
    NSSortDescriptor  *sort2= [[NSSortDescriptor alloc] initWithKey:@"Name" ascending:YES];
    [request setSortDescriptors:[NSArray arrayWithObjects:sort, sort2,nil]];

    NSArray *propertiesToFetch = [[NSArray alloc] initWithObjects:@"Name", @"ManufacturerID",@"CustomerNumber",@"City", @"StateProvince",@"PostalCode",@"UDF1",@"UDF2", nil];
    [request setPropertiesToFetch:propertiesToFetch];

    self.clientsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                        managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil
                                                   cacheName:nil];

    return self.clientsController;

}
Run Code Online (Sandbox Code Playgroud)

我有一个在我的NSPredicate中使用的ManufacturerID索引.这看起来像一个非常基本的NSFetchRequest - 我能做些什么来加快这个速度?或者我刚刚达到了限制?我肯定错过了什么.

core-data nsfetchrequest ipad

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

具有分组的核心数据NSFetchRequest

我有一个获取请求,该请求可以产生一个包含结果中两个部分的tableview.

我的模特:

@interface Player : NSManagedObject

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

此模型上的获取请求应该生成一个部分,其中一个部分中的isFacebookFriend == YES,而第二部分中的isFacebookFriend == NO.

我试过了

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
HBAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Player" inManagedObjectContext:appDelegate.managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
[fetchRequest setSortDescriptors:@[nameDescriptor]];
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setPropertiesToGroupBy:@[@"isFacebookFriend"]];
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:appDelegate.managedObjectContext sectionNameKeyPath:nil cacheName:@"playerCache"];
NSError *error;
[_fetchedResultsController performFetch:&error];
Run Code Online (Sandbox Code Playgroud)

但那没有做到.错误是:

2013-06-12 12:27:28.364 TwentyQuestions[25015:c07] Unbalanced calls to begin/end appearance transitions for <UINavigationController: …
Run Code Online (Sandbox Code Playgroud)

core-data nsfetchrequest ios

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

如何获取Core数据中的特定记录

我是iOS开发的新出价.我正在使用NSManagedObject of Core Data来执行Insert和Fetch操作.它工作得很好.但问题是,我想从表中只获取一些选定的记录(在MySQL中的条件).例如"从city ='Pune'的用户中选择名称"; 我找到了NSPredicate来获取过滤后的数据.但它提供了数组中的所有数据,而不仅仅是所选数据.例如,如果以上查询的结果是:

Anu
Run Code Online (Sandbox Code Playgroud)

然后NSPredicate结果将给出:

fname = Anu
lname = Padhye
city = Pune
id = 3
Run Code Online (Sandbox Code Playgroud)

有没有办法只在iOS Objective-c中获取所选的记录?以下是我用于NSManagedObject的代码片段:

NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"User"];
    valueData = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];


NSEntityDescription *productEntity=[NSEntityDescription entityForName:@"User" inManagedObjectContext:managedObjectContext];
NSFetchRequest *fetch=[[NSFetchRequest alloc] init];
[fetch setEntity:productEntity];
NSPredicate *p=[NSPredicate predicateWithFormat:@"id == %d", 3];
[fetch setPredicate:p];
    //... add sorts if you want them
NSError *fetchError;
NSArray *fetchedProducts=[valueData filteredArrayUsingPredicate:p];
Run Code Online (Sandbox Code Playgroud)

core-data nsfetchrequest nsmanagedobject ios

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

NSFetchRequest as entityName给出错误"使用未声明的类型"

我正在使用带有Swift 2.1和Xcode 7.2的Core数据.这段代码给了我一个无法找到实体名称的错误.这个[公司]不起作用.我有一个具有此名称的实体.

    let fetchRequest = NSFetchRequest(entityName: "Company")

    do {
        var result = try self.moc.executeFetchRequest(fetchRequest) as! [Company]
        if (result.count > 0){

        companyName?.stringValue = result[0].valueForKeyPath("name") as! String

        // success ...
        }
        else{

        }
    } catch let error as NSError {
        // failure
        print("Fetch failed: \(error.localizedDescription)")
    }
Run Code Online (Sandbox Code Playgroud)

entity nsfetchrequest swift

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

Swift - CoreData NSPredicate - 获取父母的孩子

我正在尝试获取父母的所有孩子。

在我的例子中,父对象是一个实体 AgendaEvent,它有许多 AgendaDate(子对象)。

所以这是我的功能:

 func getRelatedAgendaEvent(event: AgendaEvent) ->NSFetchRequest<AgendaDate> {
    // create a fetch request that will retrieve all the AgendaDate.
    let fetchRquest = NSFetchRequest<AgendaDate>(entityName: "AgendaDate")

    // set the predicate to only keep AgendaDate related with the AgendaEvent selected
    fetchRquest.predicate = NSPredicate(format: "parent == %@", event)

    return fetchRquest
}
Run Code Online (Sandbox Code Playgroud)

我在 didselectRow 中使用它作为 tableView:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    var eventToPass: AgendaEvent!
    var eventDateToPassArray: [AgendaDate]!

    eventToPass = myTempEvents[indexPath.row]
    eventDateToPassArray = try! context.fetch(getRelatedAgendaEvent(event: eventToPass))
    DispatchQueue.main.async { () -> Void …
Run Code Online (Sandbox Code Playgroud)

core-data nsfetchrequest ios swift

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

CoreData Predicate 获取包含数组中任何单词的每个句子

在 Swift 4 中,我有一个 CoreData“Sentence”模型,它有一个字符串属性“englishsentence”。我还有一个“单词”数组,并希望获取“englishsentence”属性包含数组中一个或多个单词的所有句子。

var words = ["today", "yesterday", "tomorrow"]
Run Code Online (Sandbox Code Playgroud)

这个数组只是一个例子。它应该在运行时改变并且可以有任何长度。

在 fetch 请求中,我试图做这样的事情:

let fetchRequest =
    NSFetchRequest<NSManagedObject>(entityName: "Sentence")
let predicate = NSPredicate(format: "ANY englishsentence CONTAINS ANY word IN %@", words)
    fetchRequest.predicate = predicate
Run Code Online (Sandbox Code Playgroud)

我能够为包含一个特定单词的所有句子创建一个谓词。但是,我无法让它与单词数组一起工作,除非我遍历单词数组并为每个单词发出新的获取请求。但这似乎非常低效。

predicate core-data nsfetchrequest swift

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

NSFetchRequest fetchBatchSize 不起作用

我在 NSFetchedResultsController 中遇到了 fetchBatchSize 问题,所以我决定退后一步,只在普通的 NSFetchRequest 上使用它。我创建了一个非常简单的项目,其中只有一个包含 100 个项目的 tableViewController。项目只有两个属性,itemID 和 itemName。我使用以下方法填充数据数组:

func initializeItems() {
        let request = NSFetchRequest<Item>(entityName: "Item")
        let messageSort = NSSortDescriptor(key: "itemName", ascending: true)
        request.sortDescriptors = [messageSort]
        request.fetchBatchSize = 20
        do {
            let fetchedResults = try context.fetch(request)
            if fetchedResults.count > 0 {
                self.items = fetchedResults
                //self.tableView.reloadData()
            }
        } catch {
            print("Could not fetch \(error)")
        }
    }
Run Code Online (Sandbox Code Playgroud)

这在 tableViewController 的 viewDidLoad 中调用。上下文定义如下:

let appDelegate = UIApplication.shared.delegate as! AppDelegate
self.context = appDelegate.persistentContainer.viewContext
Run Code Online (Sandbox Code Playgroud)

当我运行应用程序时,表格显示所有行都已完全填充(如滚动条所示)。

我不明白为什么 fetchBatchSize 被忽略了。

文档如下:

提取请求中指定的对象的批量大小。默认值为 0。批量大小为 …

xcode core-data nsfetchrequest ios swift

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

SwiftUI - 按日期对 NSFetchRequest 进行分组以显示在带有部分的列表中

我正在构建一个 SwiftUI 应用程序,它显示一个包含相关日期和持续时间的值列表。目前ContentView只是列出所有值(日期升序)。

我想要实现的是,实体按日期分组并放入其相关部分,例如:

当前的

  • 栏目:“日期”
    • 持续时间:50,日期:1 月 1 日
    • 持续时间:48,日期:1 月 1 日
    • 持续时间:21,日期:1 月 2 日
    • 持续时间:57,日期:1 月 3 日

目的

  • 部分:“1 月 1 日”
    • 持续时间:50,日期:1 月 1 日
    • 持续时间:48,日期:1 月 1 日
  • 部分:“1 月 2 日”
    • 持续时间:21,日期:1 月 2 日
  • 部分:“1 月 3 日”
    • 持续时间:57,日期:1 月 3 日

非常感谢任何帮助,非常感谢。

代码

// MARK: - ContentView

struct ContentView: View {

    // MARK: - Variables

    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(fetchRequest: EntityCore.fetch()) var entities

    // MARK: - Body

    var body: …
Run Code Online (Sandbox Code Playgroud)

core-data nsfetchrequest ios swiftui

5
推荐指数
0
解决办法
1218
查看次数