2009-10-06 18 views
9

私はほぼ完成したユーティリティアプリケーションを作成しましたが、現在はデータを維持する必要がありました。既存のユーティリティアプリケーションにコアデータを追加する方法

XCodeは、ナビゲーションまたはウィンドウベースのアプリケーションでコアデータテンプレートのみを提供するため、アプリケーションにコアデータを追加する簡単な方法はありますか?私はコアデータでは一度も働いたことがなく、メッセージを送信する履歴として460文字と連絡先の名前を持つメッセージを永続させるだけです。

または、新しいウィンドウベースのアプリケーションから始めてください。 Core Dataを作成し、Utility/Flipside Partを手作業で構築しようとしますか?

誰かが私の状況のベストプラクティスを提案できますか?

答えて

9

対象にCoreDataフレームワークを追加し、データモデルを作成し、NSManagedObjectModel,NSPersistentStoreCoordinator、およびNSManagedObjectContextオブジェクトをインスタンス化する必要があります。既存のアプリケーションにコアデータを追加する

はあなたにも関与しているものの感触を得るために、アップルtutorialを表示する必要があり

(「既存のアプリケーション」の検索)this Apple documentに簡単に説明されます。

いつでもSQLiteだけを使用することもできます。

+2

を小枝。コアデータは非常に重い義務であり、多くのデータや複雑な関係がここに残っていないように思えるので、SQLiteはそれほど複雑ではなく、より効率的な方法です。 –

+3

コアデータは簡単ですが、それがどのように動作するかを理解すれば、これは特に小規模なプロジェクトに当てはまります。 –

+4

私は自分のコードをSQLiteに対して直接ローリングすることに反対します。私が今までに見たコードはすべて、Core Dataの一部を再実装したばかりですが、バグがあり、それほど優先度の低い方法ではありません。コアデータは、特にバインディングがCocoa Touchに追加されたときの方法です。 – PeyloW

6

提供されたテンプレートを使用してXCodeで新しいプロジェクトを作成します。ストレージにコアデータを使用するかどうかを確認するボックスがあります。

これはxcdatamodelファイルと、そのプロジェクトから現在のプロジェクトにコピーできるアプリケーションデリゲートのいくつかのコード/クラス変数を提供します。

また、nallに記載されているAppleのチュートリアルもお勧めします。

代わりにSQLLiteを直接使用する場合は、SQLコードを簡略化するFMDBの使用を強く検討してください。これは、プロジェクトに追加する1つのファイルです。

+0

SQLiteを使うつもりなら、FMDBもお勧めします。 –

18

コアデータのtwighlightzoneも理解しようとしているので、空のアプリケーションプロジェクトと空のアプリケーションプロジェクトをコアデータと比較することで、通常のプロジェクトをコアデータに移行するための次の手順を考え出しました)

ステップ1:CoreData.frameworkは

a)は、 "リンクされたフレームワークとライブラリ" の "プロジェクトのターゲットの概要" では +ボタン
BとCoreData.frameworkを追加します) File/New/Fileを選択し、 'Core Data'セクションで新しい 'Data Model'を追加します。(名前は3.bを参照してください)XXXXXXX
c)ファイルAPPLIKATION-Prefixにあります。 AppDelegateで:PCH(アプリケーションは、プロジェクトの名前である)他の二つの下

#import <CoreData/CoreData.h> 

を追加するには、ディレクティブ

ステップ2が含まれます。終わりに

@synthesize managedObjectContext = __managedObjectContext; 
@synthesize managedObjectModel = __managedObjectModel; 
@synthesize persistentStoreCoordinator = __persistentStoreCoordinator; 

B)

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; 
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; 
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; 

- (void)saveContext; 
- (NSURL *)applicationDocumentsDirectory; 

ステップ3: AppDelegate.m

A) Syntesize特性Hは、以下のプロパティ/メソッド宣言を追加しますモジュールの次の行を追加します。

重要: MethodeのmanagedObjectModelpersistentStoreCoordinatorであなたはXXXXXXXを交換する必要があり、私が代わりにSQLiteのを使用してのアイデアに同意するあなたの個人的な.xcdatamodeldファイルの名前

- (void)saveContext 
{ 
    NSError *error = nil; 
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext; 
    if (managedObjectContext != nil) 
    { 
     if ([managedObjectContext hasChanges] & ![managedObjectContext save:&error]) 
     { 
      /* 
      Replace this implementation with code to handle the error appropriately. 

      abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      */ 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
    } 
} 

#pragma mark - Core Data stack 

/** 
Returns the managed object context for the application. 
If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application. 
*/ 
- (NSManagedObjectContext *)managedObjectContext 
{ 
    if (__managedObjectContext != nil) 
    { 
     return __managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) 
    { 
     __managedObjectContext = [[NSManagedObjectContext alloc] init]; 
     [__managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    } 
    return __managedObjectContext; 
} 

/** 
Returns the managed object model for the application. 
If the model doesn't already exist, it is created from the application's model. 
*/ 
- (NSManagedObjectModel *)managedObjectModel 
{ 
    if (__managedObjectModel != nil) 
    { 
     return __managedObjectModel; 
    } 
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"XXXXXXX" withExtension:@"momd"]; 
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 
    return __managedObjectModel; 
} 

/** 
Returns the persistent store coordinator for the application. 
If the coordinator doesn't already exist, it is created and the application's store added to it. 
*/ 
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    if (__persistentStoreCoordinator != nil) 
    { 
     return __persistentStoreCoordinator; 
    } 

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"XXXXXXX.sqlite"]; 

    NSError *error = nil; 
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) 
    { 
     /* 
     Replace this implementation with code to handle the error appropriately. 

     abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 

     Typical reasons for an error here include: 
     * The persistent store is not accessible; 
     * The schema for the persistent store is incompatible with current managed object model. 
     Check the error message to determine what the actual problem was. 


     If the persistent store is not accessible, there is typically something wrong with the file path. Often, a file URL is pointing into the application's resources directory instead of a writeable directory. 

     If you encounter schema incompatibility errors during development, you can reduce their frequency by: 
     * Simply deleting the existing store: 
     [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil] 

     * Performing automatic lightweight migration by passing the following dictionary as the options parameter: 
     [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 

     Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details. 

     */ 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    }  

    return __persistentStoreCoordinator; 
} 

#pragma mark - Application's Documents directory 

/** 
Returns the URL to the application's Documents directory. 
*/ 
- (NSURL *)applicationDocumentsDirectory 
{ 
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
} 
+0

コンテキストを管理する方法は、モデルを認識していますか?自動的に? – fengd

+0

@ Jun1st:sqliteとmomdファイルの名前をxcdatamodelと同じに変更すると、この例でコンテキストをモデルにリンクする方法です – ColdLogic

関連する問題