2011-07-05 5 views
0

コアデータを使用してデータベースを作成し、その初期化済みファイルをSQLite Managerに読み込むことによって、アプリケーションのデータを事前に設定しています。コアデータで使用するためにSQLiteテーブルに画像をあらかじめ入力することは可能ですか?コアデータ:イメージ付きSQLiteエンティティの事前入力

私の初期の考えは、SQLite Managerを通して画像をBLOBとして挿入することです。その後、postに基づいて、タイプをバイナリに設定し、UIImage initWithData:でインポートする必要があるように見えます。

これは実行可能ですか?もしそうなら、これは適切な方法ですか?

答えて

2

コアデータで使用するためにSQLiteデータベースにイメージを事前に設定することは、ほんのわずかです。

  1. 最初にCore Dataアプリケーションを設定し、画像に「バイナリ」タイプを含めるように属性を実装します。アプリケーションを構築し、アプリケーションシミュレータ内のコアデータを利用してビューにナビゲートします。これにより、コアデータで使用するために必要なSQLiteデータベースが初期化されます(次のようにpersistentStoreCoordinatorを実装したと仮定します)。 "ユーザー//ライブラリ/ Application Support/iPhoneシミュレータ/ユーザ/アプリケーション/" で
    - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
        if (persistentStoreCoordinator != nil) { 
         return persistentStoreCoordinator; 
        } 
        NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"YourDBName.sqlite"]; 
    
        // Set up the store. 
        // For the sake of illustration, provide a pre-populated default store. 
    
        NSFileManager *fileManager = [NSFileManager defaultManager]; 
        // If the expected store doesn’t exist, copy the default store. 
        if (![fileManager fileExistsAtPath:storePath]) { 
         NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"YourDBName" ofType:@"sqlite"]; 
         if (defaultStorePath) { 
          [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL]; 
         } 
        } 
    
        NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; 
        NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
              [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
              [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
              nil]; 
        persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; 
    
        NSError *error; 
        if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { 
         // Update to handle the error appropriately. 
         NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
         exit(-1); // Fail 
        } 
        return persistentStoreCoordinator; 
    } 
    
    1. ナビゲートし、アプリケーションデータへ

  2. 。 「修正日時」でフォルダを並べ替えると、アプリケーションは最新の日付になります(他のアプリケーションを作成していないと仮定します)。アプリケーションフォルダを入力し、初期化された< YourDBName.sqlite>がDocumentsフォルダに存在します。 SQLiteデータベースを別の場所(デスクトップなど)にコピーして元のファイルを削除します(これは、Core Dataが作成しようとしている事前入力済みのSQLiteデータベースを再ロードするために必要です)。

  3. オープン<あなたのお気に入りのSQLiteエディタ(FirefoxのSQLite Managerプラグインは適切で無料のオプションです)を使用してYourDBName.sqliteを開きます。テーブルにエントリを追加し、画像を「BLOB」として挿入します。

  4. XCode内には、既存のファイルとしてのYourDBName.sqliteが追加されています。コアデータは、次回にアプリケーションを起動したときに、このファイルがアプリケーションデータフォルダにコピーされます(既存の権利を削除したのでしょうか?)。

  5. アクセス[UIImage imageWithData:< DataObject >.< ImageAttributeName >

1

画像の大きさはどれくらいですか?ファイルがかなり大きい場合は、イメージをファイルシステムに保存し、コアデータ内のその場所への参照を保持することで、より効果的になる可能性があります。

イメージが常にあなたのアプリに存在する場合は、バンドルにイメージをパッケージ化することができます。そうでない場合(たとえば、ユーザーが不要な画像を削除する場合など)、最初に画像を取り込む必要があります。

+0

画像を使用してコード内であなたの事前に画像のみ(を10kBに8程度)のサムネイルであろう。可能であれば、それらをデータベースに配置して、データベースへの更新でデータの更新を一度に処理できるようにしたいと思います。 –

+0

データベースを事前にシードするときはいつでも、私はシミュレータ/デバイスに作業をさせて、互換性があることを知っています。ユーザーが新しいイメージを追加できると仮定しているため、コアデータのNSDataフィールドにイメージを追加および取得してデータベースの最初の事前シーディングを行う作業を行うために作成する方法を使用します。 –

+0

この場合、エンドユーザーはデータベースを更新することはできませんが、アプリケーションを読み込むことで確実に画像を取得することができます。 –

関連する問題