0

CoreDataを使用してCustomerエンティティを保存するアプリケーションがあります。各Customerエンティティには、、、customerNameおよびcustomerIDその他のプロパティがあります。

次に、とを表示しているすべてのリストを表示CustomerscustomerNameますcustomerID

Customerフェッチリクエストを実行してすべてのエンティティを取得することでこれをうまく行うことができますが、表示する必要があるのはcustomerNameandcustomerIDプロパティだけです。

質問1: を使用しsetPropertiesToFetchてこれらのプロパティのみを指定しようとしていますが、配列内の1つのオブジェクトのみを返すたびに。

私の方法は次のようになります。

    NSFetchRequest *fetchRequest = [NSFetchRequest new];


    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Customer" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    NSDictionary *entProperties = [entity propertiesByName];

    [fetchRequest setResultType:NSDictionaryResultType];
    [fetchRequest setReturnsDistinctResults:YES];

    [fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:[entProperties objectForKey:@"customerName"],[entProperties objectForKey:@"customerID"], nil]];

    [fetchRequest setFetchLimit:30];

    NSError *error;
    NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

    NSLog(@"fetched objects count = %d", [fetchedObjects count]);

    if (error) {
        NSLog(@"Error performing fetch = %@", [error localizedDescription]);
        return nil;
    } else {
        NSLog(@"successful fetch of customers");
        for( NSDictionary* obj in fetchedObjects ) {
            NSLog(@"Customer: %@", [obj objectForKey:@"customerName"]);
        }
        return fetchedObjects;
    }

Customer返される1つのオブジェクトは問題ないので、少なくとも1つのオブジェクトcustomerNameとを取得していることがわかりますcustomerIDCustomerすべてのオブジェクトcustomerNameとを返すために必要customerIDです。

質問2:

これはこれを行うための最良の方法ですか?私の考えでは、データベースには最大10,000以上の顧客オブジェクトが存在する可能性があります。したがって、オブジェクト全体ではなく、テーブルに表示するために必要なプロパティのみをフェッチする方がメモリ効率が高くなりCustomerます。

次に、テーブルで顧客が選択されると、Customerオブジェクト全体をフェッチして詳細を表示します。

ただし、近い将来、それぞれのエンティティが使用される可能性がある場合は、プロパティだけでなく、エンティティ全体をロードすることもお勧めします。アイデアは、1つのフェッチ要求が2つよりも優れているということだと思います。

ご協力ありがとうございました。

4

2 に答える 2

2

質問1の場合:これがswiftで書かれた私のサンプルコードです。私はCoreDataAPIを継続的にテストし、この呼び出し方法を見つけました。あなたを助けることを願っています。

let fetchRequest = NSFetchRequest<NSDictionary>(entityName: "Customer")
fetchRequest.resultType = .dictionaryResultType
fetchRequest.propertiesToFetch = [
    #keyPath(Customer.customerID),
    #keyPath(Customer.customerName)
]

let customers: [NSDictionary]
do {
    customers = try managedObjectContext.fetch(fetchRequest)
    customers.forEach {
        print("CustomerID: \($0["customerID"]), CustomerName: \($0["customerName"])")
    }
} catch {
    print(error.localizedDescription)
}
于 2017-02-18T13:43:59.250 に答える
0

ランダム、

質問2:バッチ制限を使用する必要があるときにフェッチ制限を使用しているようです。バッチ制限は、基本的なカーソルメカニズムです。これらは、メモリを効率的に処理するように設計されています。

質問1では、自然な方法でアプリを作成し、Instrumentsやその他のツールを使用してパフォーマンスとメモリの最適化を決定することを大いに信じています。最初にアプリを正しく実行してみてください。次に、それを速くします。

アンドリュー

于 2013-02-15T04:58:41.040 に答える