0

CoreDataデータベースを使用するTableViewControllerがあります。TableViewControllerのデータベースを読み取る別のUIviewControllerがあります。私がしたことは次のとおりでした。

//In UIviewController
-(NSArray *)fetchRecordedDatainsqldatabase
{
    // construct a fetch request

    NSError *error;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"TrackerList" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    //[fetchRequest setFetchBatchSize:20];
    // Create the sort descriptors array.
    NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"descript" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:descriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];
    // return the result of executing the fetch request
    return [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];}

私はのプロパティを持っています

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;

But managedObjectContext is always nil, at the line
NSEntityDescription *entity = [NSEntityDescription entityForName:@"TrackerList" 
inManagedObjectContext:self.managedObjectContext];

したがって、プログラムはその行に到達すると常にクラッシュします。何が問題なのですか?

4

2 に答える 2

0

通常、でmanagedObjectContext提供されているスタブコードを使用できますAppDelegate。その場合は、次を使用できます。

AppDelegate *appD = [[UIApplication sharedApplication] delegate];

次に、行の代わりに:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"TrackerList" 
inManagedObjectContext:self.managedObjectContext];

使用する:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"TrackerList" 
inManagedObjectContext:appD.managedObjectContext];

そして、returnステートメントを次のように置き換える必要があります。

return [appD.managedObjectContext executeFetchRequest:fetchRequest error:&error];

NSManagedObjectContext独自のオブジェクトを作成する場合は、そのオブジェクトを設定persistentStoreCoordinatorする必要があります(これには、管理対象オブジェクトモデルが必要であり、永続ストアタイプを設定します)。

AppDelegate.mプロジェクトの作成時に「usecore-data」をチェックした場合は、でこれらすべてを行う方法を確認できます。

とにかく、あなたの場合、あなたはすでに最初のViewControllerでmanagedObjectContextを正常に使用しています。したがって、2番目のViewControllerで同じオブジェクトを取得する必要があります。

メソッドを機能させるには、指定したコードブロックの先頭に1行追加するだけです。

self.managedObjectContext = [[[UIApplication sharedApplication] delegate] managedObjectContext];
于 2013-03-03T08:54:14.133 に答える
0

管理対象オブジェクトコンテキストは、永続ストアコーディネーターで初期化する必要があり、管理対象オブジェクトモデルが必要です。XCodeは、AppDelegateでのこれらすべての実装のボイラープレートコードを提供するために使用されます。

別の解決策として、 MagicalRecordの使用を試すことができます

コアデータは次の方法で設定できます

[MagicalRecord setupCoreDataStackWithStoreNamed:@"Database.sqlite"];

そして、あなたはコンテキスト内のすべてのトラッカーリスト値をフェッチすることができます

NSManagedObjectContext *context = [NSManagedObjectContext defaultContext];
[TrackerList findAllSortedBy:@"descript" ascending:YES inContext:context];

次のリンクは 、CoreDataでのプログラミングを快適にする方法をよりよくガイドします

于 2013-03-03T09:04:07.227 に答える