2009-10-28 17 views
12

私はiPhoneアプリケーションを作成しており、コアデータがSQLiteデータベースよりも読み込み専用の方が良いかどうか疑問に思っています。それはSQLite DBがより良い選択であるように感じます、そうですか?コアデータストレージを事前に入力することはできますか?コアデータは読み取り専用データにも有効ですか?

基本的には、3つのテーブル(1つに最大3000個)のエンティティが必要です。次に、TableViewsでデータを一覧表示したり、検索したり、他の目的でデータを読み込んだりします。

この場合、Core Dataを使用する必要がありますか?

答えて

13

読み取り専用のデータをテーブルビューで表示する場合、Core DataをSQLite経由で使用すると大きな利点が得られますNSFetchedResultsControllerのためです。この便利なクラスにより、データベース要素をテーブルビューに表示することが非常に簡単になり、バッチフェッチを処理できます。バッチ処理では、必要な情報だけを画面に表示し、読み込み時間とメモリ使用量を大幅に改善します。

私は、アプリケーションのバンドルに同梱されている読み取り専用情報として、ユーザーのアプリケーションデータに格納されている書き込み可能なデータベースとデータモデルを共有できるという事実を使用します。 iPhone OS 2.xデバイスをターゲットにする必要がない限り、Core Dataを使用することをおすすめします。

-8

Core DataはSQLite(他のオプションもあります)を使用していますので、あなたの質問に多少の欠陥があります。

+4

私は間違った質問とは考えていません。 CoreDataは*基礎となる*ストレージ用にSQLiteを使用しますが、SQLite自体に対するインタフェースはありません。代わりに、CoreDataの力はそのクラスとメソッドから派生しています。たとえば、 'NSFetchedResultsController'を' UITableView'とともに使用すると、必要に応じて効率的にディスクからデータを読み込み、それに従ってメモリを管理するのに役立ちます。ストレートSQLiteを使用する場合、あなたは本質的にこれを行う必要があります。 – jbrennan

+0

コアデータを使用すると、SQLite APIはどこに移動しますか?私が知る限り、それはまだそこにある。 –

+1

私はすぐに両方にアクセスできるかどうかは気にしません(おそらく、Core Dataでオブジェクトを管理することは悪い考えです)。私は1つを使いたいと思うし、どちらが最善であるかを知る必要があります。 – Christian

2

それがために悪いフィットのように聞こえるのにあなたは間違いなくちょうどあなたが可能性として、あなたのアプリケーションに予め充填されたSQLiteデータベース、またはすべてのデータの大きなのplistを(事前に充填されたコアデータストアを出荷することができますこの場合)、または何でも。

コアデータはすべてネイティブのココアであり、DBからネイティブオブジェクトへのすべての読み込みを処理し、無条件に最適化されているなどの点で優れています。しかし、リビジョンの処理、変更の保存、アンドゥとリドゥのサポートなど、気にしないことを行うためのコードもたくさんあります。したがって、どちらかといえば明らかに正しい答えはありません。

多くは、コアデータと選択肢の両方であなたの快適さのレベルに依存します。あなたのデータを取得するためにSQLite API(または多くのCocoa wrappersのうちの1つ)を扱ってうれしいですか?もしそうなら、それはもっと簡単かもしれません。コアデータを持っていれば、あなたにとってORMは大きな勝利になるでしょう。一方、Core Dataを使用した複雑なクエリでは述語APIを使用しますが、これはSQLiteを使用するよりも複雑なことがあります。そんなこと。

+0

テーブルの1つに3000レコードまでの情報を追加しました。私が自分のことを簡単に決めることができたら、ここで質問する必要はありません。しかし大きな欠点がないことを知ることは助けになります。 – Christian

2

どのような関係性があるかによって、plistから読み込み専用データを読み取る方がよい場合があります。 Plistは読み込み/保存が容易で(NSDictionariesに変わります)、簡単に編集できます

+0

ああ、それは考えていない。彼らはリレーショナルです。それは、「駅は輸送手段に属するルートに属している」のようなものです。それはplistsのために最適ではありません、そうですか? – Christian

+0

に依存します。厳密に階層化されているのですか、多対多の関係がありますか? plistは前者をうまくやっているが、後者は難しい。 –

+0

ええ、多対多の関係があります。だから私はplistsと一緒に行かない方が良い。どうもありがとう! – Christian

10

ここでは、plistを使用してコアデータストアをプリロードする簡単な方法があります。

辞書の配列を含むプロパティリストを作成します。各辞書のキーを管理対象オブジェクトのキーに対応させます。

alt text http://www.freeimagehosting.net/uploads/b0b1909e81.png

次に、このメソッドを初めて呼び出すアプリが起動します:

- (void)loadDataFromPropertyList { 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"plist"]; 
    NSArray *items = [NSArray arrayWithContentsOfFile:path]; 

    NSManagedObjectContext *ctx = self.managedObjectContext; 

    for (NSDictionary *dict in items) { 
     NSManagedObject *m = [NSEntityDescription insertNewObjectForEntityForName:@"TheNameOfYourEntity" inManagedObjectContext:ctx]; 
     [m setValuesForKeysWithDictionary:dict]; 
    } 

    NSError *err = nil; 
    [ctx save:&err]; 

    if (err != nil) { 
     NSLog(@"error saving managed object context: %@", err); 
    } 
} 

コールloadDataFromPropertyListアプリはapplication:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsの実装に次のコードを含むことによって起動する最初の時間:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
if (![defaults objectForKey:@"firstRun"]) 
{ 
    [defaults setObject:[NSDate date] forKey:@"firstRun"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    [self loadDataFromPropertyList]; 
} 
関連する問題