10

私は、Mac OS X 開発に挑戦したいと熱望している .NET 開発者の大衆の 1 人です。現時点では、Cocoa のさまざまな要素を理解しようとしており、Core Data に少し行き詰まっています。

Web で入手できるほとんどのドキュメントとリソースには、モデルから始まり、クラスの生成、ドキュメントベースの UI など、広範なエンド ツー エンドのチュートリアルが含まれていることに気付きました。各ビットに十分に焦点を当てていないか、少なくともそうではないようです。十分な例。

誰かが私を正しい方向に向けることができますか?それはオンラインの資料であろうと本であろうと、さまざまなビットの詳細な指示を与えることができますか? 多分私は.NETの世界で立ち往生しているかもしれませんが、私はまだデータアクセスレイヤーなどの観点から考えています.「CRUD」の基本、永続ストアの設定、エンティティの作成、編集、保存について知りたいです.保存するなど。UI について詳しく説明することなく、基本的なことだけを説明します。また、さまざまなビットを単体テストできるといいですね。

私はここで正しい考え方を身につけようとしていると思います..NET開発者は、Cocoaプログラミングを見ている私たちのような人々のための適切な読み物を知っていますか?

どうもありがとう、ダニー。

4

6 に答える 6

15

まず、Apple のドキュメント (および Apple エンジニアからの繰り返しのコメント) が述べているように、Core Data は「高度な」Cocoa テクノロジです。コアデータをグロッキングするには、多くの Cocoa パラダイムとパターンに関する知識が必要です。真剣に、まずココアを学びましょう。次に、Core Data を使用せずにプロジェクト (または複数) を作成します。次にコアデータを学びます。真剣に。

あなたの好奇心を静めるために、CRUD の回答を試してみますが、それはあなたが望む回答にはなりません。答えは、コア データの CRUD パターンは存在しないということです。少なくとも、あなたが考えているようなものではありません。その理由は、Core Data がデータ アクセス レイヤーではないためです。オブジェクト グラフ管理フレームワークです。つまり、明示的で意図されたCore Data の仕事は、オブジェクト インスタンスのグラフを管理することです。このグラフには、制約 (関係のカーディナリティや個々のインスタンス属性に対する制約など) と、グラフを介して変更をカスケードするための規則 (削除など) があります。Core Data はこれらの制約を管理します。オブジェクト グラフは大きすぎてメモリに格納できない場合があるため、Core Data はオブジェクト グラフへのインターフェイスを提供します。これは、フォールトによってメモリ内のオブジェクト グラフ全体をシミュレートします[1] (オブジェクト インスタンスは、最初に管理対象に持ち込まれたときに「フォールト」ではありません)。オブジェクト コンテキストと、永続ストアから属性を遅延して入力するために「起動」される) および一意化 ((永続ストア内の) 特定のエンティティ インスタンスのメモリ内インスタンスが 1 つだけコンテキスト内に作成される)。

Core Data はたまたまディスク上の永続ストアを使用して、大きなオブジェクト グラフのインターフェイスを実装しています。SQLite 永続ストアの場合、この実装は単に行われますSQL 互換データベースを使用する。ただし、これは実装の詳細です。たとえば、ディスクに何も永続化しないが、Core Data が通常どおりオブジェクト グラフを管理できるようにするインメモリ永続ストアを作成できます。したがって、Core Data は実際にはデータ アクセス レイヤーではありません。このように考えると、その真の力を見失い、フラストレーションにつながります。任意のデータベース スキーマで Core Data を使用することはできません (これが、すべての Core Data チュートリアルが NSManagedObjectModel の作成から始まる理由です)。Core Data を永続化フレームワークとして使用したり、別のモデル レイヤーを使用したりしないでください。Core Data をモデル レイヤーとして使用し、モデルのオブジェクト グラフをディスクに永続化する Core Data の機能を利用する必要があります。

そうは言っても、NSManagedObjectContext(上で説明したオブジェクト グラフ インターフェイスを提供する)を作成するには、次のようにします。

NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObject:[NSBundle mainBundle]]]; // though you can create a model on the fly (i.e. in code)
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];

NSError *err;

// add an in-memory store. At least one persistent store is required
if([psc addPersistentStoreWithType:NSInMemoryPersistentStore configuration:nil URL:nil options:nil error:&err] == nil) {
  NSLog(@"%@",err);
}

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init];
[moc setPersistentStoreCoordinator:psc];

(ガベージ コレクションを使用していると仮定していることに注意してください。このコードは、手動のメモリ管理環境でリークします)。

エンティティ インスタンスを追加するには (moc上記の続き):

NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:moc];  
//entity will be nil if MyEntity doesn't exist in moc.persistentStoreCoordinator.managedObjectModel

NSManagedObject *obj = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:moc];

管理対象オブジェクトを作成するにはエンティティの説明が必要であり(チュートリアルがモデルから始まる理由)、管理対象オブジェクトのコンテキストがないと管理対象オブジェクトを作成できないことに注意してください。

エンティティ インスタンスを更新するには:

[obj setValue:myValue forKey:@"attributeKey"]; //or use any method on `obj` that updates its state
NSError *err;
if(![moc save:&err]) {
  NSLog(@"%@", err); // an erro occurred in saving, perhaps due to optimistic locking failure
}

エンティティ インスタンスを削除するには:

[moc deleteObject:obj];
if(![moc save:&err]) {
  NSLog(@"%@", err); // an erro occurred in saving, perhaps due to optimistic locking failure
}

[1]: バイナリまたは XML 永続ストアの場合、グラフ全体メモリに格納されます。

于 2009-11-11T19:19:34.203 に答える
8

私は次のルートを取ります:

  1. Apple Cocoa の一般的なチュートリアル: 通貨コンバーターを実行します。
  2. 次に、そのチュートリアルのCocoa バインディング バージョンに飛び込みます (コア データに進む場合、バインディングは非常に便利で非常に重要です)。
  3. Cocoa Dev Central の「コア データ アプリの構築」チュートリアル

さらに読む:
いつものように: 本Cocoa Programming for Mac OS X
Document-Based Application Architecture (ADC)
最後に: Cocoa と .net のいくつかの側面の比較

于 2009-11-11T09:41:35.900 に答える
5

Core Data は、実際にはデータ アクセス レイヤーではありません (詳細については、他の回答を参照してください)。しかし、Cocoa 用のデータ アクセス レイヤーが必要な場合はどうでしょうか。あなたの選択肢は何ですか?私はプロの Cocoa および Qt 開発者であり、これまで Windows または Java エンタープライズの世界を回避することができたので、選択肢に対する私の評価はあなたの評価と正確に一致しない可能性があります。エンタープライズのエコシステムから来ているので、オプションが少し怖いと思うと思います. 私はあなたにとって最も怖いものから最も怖いものへとそれらを注文しました(大まかに最もCocoa-yであり、私にとっては大まかに最もよく知られているものから最も少ないものまでです). あなたの胃がよろめくのを止め、あなたの解決策を見つけたリストの場所を見つけてください...

  1. Core Data は、MVC アーキテクチャのモデル コンポーネントのオブジェクト グラフを管理するための非常に強力なフレームワークですが、それを使用する義務はありません。独自のモデル レイヤーを作成し、Cocoa MVC の世界で遊ぶことができます。これは、Core Data の前に行った方法です。必要に応じて、引き続き Cocoa NSObjectControllerNSArrayController、および を使用できNSTreeControllerます。したがって、データベース ベンダーのネイティブ C/C++ API を使用して、独自のデータ アクセス層を作成できます。

  2. BaseTenフレームワークは、PostgreSQL バックエンド上にある商用ライセンスの Core Data に似た API です。Core Data のようなオブジェクト グラフ管理フレームワークというよりは、実際には ORM に近いものですが、API は似ています。私の理解では、既存の (任意の) スキーマを処理したり、Core Data マネージド オブジェクト モデルを利用したりできます。NSArrayControllerこれらは、Cocoa のアレイ コントローラの代わりにドロップインとして使用できる独自のサブクラスを提供します。私は BaseTen を個人的に使用したことがないので、その有用性について話すことはできませんが、良いことを聞いています。私の知る限り、それはPostgreSQLのみです。

  3. PyObjC と呼ばれる Python-Objective-C ブリッジは非常に成熟しており、OS X 10.5 以降に同梱されています。このブリッジを使用すると、完全な Cocoa アプリを Python で作成したり、ハイブリッド Python/Objective-C アプリを作成したりできます。PyObjC を使用すると、 SQLAlchemyなどの任意の Python ORM を利用して、モデル レイヤーを実装できます。繰り返しますが、仕事がないわけではありませんが、有能な Python および Cocoa プログラマーにとっては比較的簡単かもしれません。

  4. WebObjects の一部である Apple の Enterprise Object Framework は、Objective-C ORM の系譜を持つ Java ORM になりました。WebObjects を使用してデスクトップ アプリを作成することはまだ可能だと思います。多くの Cocoa パターンが引き継がれていることは理解していますが、これは非常に異なる獣です。私は WebObjects コードを書いたことがないので、これ以上のアドバイスはできません。

  5. クロスプラットフォームのツールキットを利用できます。Qtはまともな Mac UI を生成できます (ただし、以下を参照)。Qt には、QtSqlモジュールの複数のデータベースに対する SQL サポートを含むモデル層フレームワークもあります。Qt は Cocoaはありません。経験豊富な Mac ユーザーは、非ネイティブ アプリを好みません。Qt は、OS X 上のクロスプラットフォームとほぼ同じくらい優れていますが、完璧ではありません。ネイティブのままでいられるなら、そうしてください。

  6. Java Swing/SWT がらくた。繰り返しますが、これは強力な機能ですが、Mac では地獄のように見え、ユーザーは気に入りません。

  7. OS X 上の Mono は比較的未熟で、Mono 上の .Net ORM のステータスがどのようなものかわかりません。それは一見の価値があります。UI に関する限り、Mono-GTK は OS X ではかなり悪いように見えます。Mono で実行される Qyoto と呼ばれる Qt 用の C# バインディングがあります。

于 2009-11-12T07:05:18.193 に答える
4

これらの本についてまだ誰も言及していないようです:

于 2009-11-11T19:32:54.657 に答える
1

ただし、要点については、AppleのCoreDataBasicsが役立つ場合があります。GUIのない​​ユーティリティを構築するためのチュートリアルもあります。

于 2009-11-11T17:19:45.817 に答える
0

Apple は電化製品や有名人の製品を販売しています (ハリウッド) 彼らは企業の開発とはまったく関係がありません。delphi/vcl または .net レベルで何かを探しているのであれば、日和見的なココア タッチが完成する前に、ココアは放棄されました。頑張ってください。 (彼らはこの種のものを持っていません)

psこれが、Appleがサーバー側および/またはエンタープライズデスクトップ側について何も言わない理由です。つまり、彼らには手がかりがなく、今後も決してそうなりません。つまり、彼らは別のビジネスに携わっています。彼らの内部システムでさえ Linux ベースです (お知らせするだけです!)

于 2013-11-16T19:11:32.263 に答える