1

ManagedObjects に変更を加え、それらの変更を永続ストアに保存する際に問題があります。

機能するのは、オブジェクトの削除、オブジェクトの挿入です。そしてそれらのオブジェクトをフェッチします。前述のとおり、取得した管理対象オブジェクトを変更できませんでした。

私は2つのView Controllerを持っています。どちらにもパブリック プロパティがあります。

@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;

AppDelegate.m ファイルは、次のように application:didFinishLaunchingWithOptions: メソッドの最初のビュー コントローラーにこのプロパティを設定します。

// get reference to view controller //
//..
controller1.managedObjectContext = self.managedObjectContext;

ビュー コントローラー 1 は、2 番目のビュー コントローラーにプッシュするときに、managedObjectContext を再び渡します。これは、次のように prepareForSegue: メソッドで行われます。

// Get reference to the detail view //
MySecondViewController *controller2 = segue.destinationViewController;        
// Pass the managed object context //
controller2.managedObjectContext = self.managedObjectContext;

この 2 番目のビュー コントローラー内で、コア データからオブジェクトを取得し、次のようにビュー コントローラーのプロパティに格納します。

@property (nonatomic, strong) MyKindOfObject *object;
...
self.object = [fetchResults lastObject];

私はうまく結果を得るので、オブジェクトのフェッチはうまくいくようです..

取得したオブジェクトには多くのプロパティがあり、そのうちの 1 つは NSString 型です。UITextField に表示するこのプロパティの値。ユーザーはここで値を変更でき、完了したらボタンを押します。アクションをキャッチし、次のことを行います。

self.object.mytext = textField.text;

続いてコアデータへの保存を試みます:

// Save to CoreData //
NSError *error = nil;
if(![self.managedObjectContext save:&error]){
    // handle the error //
    NSLog(@"is error");
}
else{
    NSLog(@"no error");
}

1) 次にユーザーがこのビュー コントローラーに戻ったときに、オブジェクトが再度取得されます。しかし、それはまだ古い値を持っています。

2) また、SQLite Manager という Firefox アドオンを使用して、関連する sqlite ファイル内のデータを監視しています。コードをステップ実行するとき、save メソッドを呼び出した後、ファイルは何も変更されません。

3) Xcode 内でも、変数ビューを使用して self.managedObjectContext オブジェクトを監視します。新しいデータをオブジェクトに格納するとき、save を呼び出す直前に、self.managedObjectContext のプロパティは変更されません (unprocessedChanges や changedObjects など)。

4) managedObjectContext の hasChanges メソッドへの呼び出しも追加しましたが、これは NO を返します。

if([self.managedObjectContext hasChanges]){
   NSLog(@"changes managed object context!");
}

5) 関連する managedObject の hasChanges メソッドへの呼び出しも追加しましたが、これも NO を返します。

if([self.object hasChanges]){
    NSLog(@"changes in managed object!");
}

私はおそらくここで何か完全に間違ったことをしているのですが、それが何であるかわかりません。誰かが私を助けてくれることを本当に願っていますか?. 前もって感謝します!

4

1 に答える 1

2

私自身の質問に答えさせてください。初心者の私は、まったく間違ったことをしました。私はリンゴ自身よりもよく知っていると思っていました。教訓:私はしません!

モデル内にエンティティを作成した後、各エンティティのカスタム管理オブジェクト クラス (または実際には各エンティティの NSManagedObject サブクラス) を作成しました。生成された実装ファイル内では、すべてのプロパティ (属性) が @dynamic として実装されます。知識が不足しているため、これを理解/認識できませんでした。だから私の初心者は考えました:それをすべて@synthesizeに変更しましょう。

この投稿が、他の初心者が同じ間違いをしないようにするのに役立つことを願っています.

于 2012-09-06T10:00:42.373 に答える