2012-08-07 9 views
5

私はAppleのデータストレージのガイドラインを読んで、私は自分のアプリで作成しているsqliteデータベースファイルをどこに保管するべきかについて本当に混乱しています。私は、アプリケーションがオフラインモードであっても、sqliteファイルから読み込みたいです。私は、作成されたそのようなファイルは、 "バックアップしない"フラグが設定されたライブラリ/キャッシュに保存されるべきであると読んでいます。同じことをするための正しいアプローチを提案してください。ドキュメントディレクトリまたはライブラリ/キャッシュにsqliteデータベースファイルを書き込む必要がありますか?

答えて

5

答えはあなたのデータベースファイルが作成されている方法によって異なります。

According to the Data Storage Guidelines page:ユーザー生成され、またはそうでなければ、あなたのアプリケーションで再作成することはできません

  1. のみの文書やその他のデータ/ Documentsディレクトリ に保存され、iCloudによって自動的に にバックアップされます。

  2. 再ダウンロードまたは再生成できるデータは、/ Library/Cachesディレクトリに保存する必要があります。ファイル の例として、データベースキャッシュファイル と、マガジン、新聞、 およびマップアプリケーションで使用されているようなダウンロード可能なコンテンツがキャッシュディレクトリに格納されます。

これは私には比較的明確なようだ:あなたのアプリはプログラム的に何かを作成したり、保存したいデータを生成した場合、「キャッシュ」フォルダに入れて。顧客自身が生成するユニークなもの(キーボードや手動で介入して入力したもの)があれば、それを「ドキュメント」に入れます。

「バックアップしない」とは、ファイルが決してがiCloudに送信され、紛失した場合はゼロから再作成する(または再インストールする)必要があることを意味します。

+0

私は完全に静的なアプリを開発しました。私は4メガバイト以上のサイズのデータ​​を保管しています。このコンテンツでは、アプリは機能しません。私の場合は、どこにローカルデータベース(ドキュメントフォルダまたはライブラリフォルダ)を保存する必要があります – Warrior

+0

[まあ私はあなたがすでに別の質問としてこれを求めているのを見ました](http://stackoverflow.com/questions/16767861/where-to-あなたのために答えを探しに行くでしょう –

+0

新しい拡張機能と時計はどうなりますか? –

1

これはあなたを助けるかもしれません。文書ディレクトリにデータベースをコピーするだけで十分です。バンドルされているファイルは読み取り専用です。状況によっては、いつでも更新する必要がある場合は、文書ディレクトリにデータベースが存在しない場合は、まずデータベースをコピーしてください。

ドキュメントディレクトリにデータベースをされてコピーするためのサンプルコードは、次のとおりです。

-(void) checkAndCreateDatabase { 

    // Setup some globals 
    NSString *databaseName = @"AnimalDatabase.sql"; 

    // Get the path to the documents directory and append the databaseName 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [documentPaths objectAtIndex:0]; 
    NSString *databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; 


    // Check if the SQL database has already been saved to the users phone, if not then copy it over 
    BOOL success; 

    // Create a FileManager object, we will use this to check the status 
    // of the database and to copy it over if required 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    // Check if the database has already been created in the users filesystem 
    success = [fileManager fileExistsAtPath:databasePath]; 

    // If the database already exists then return without doing anything 
    if(success) return; 

    // If not then proceed to copy the database from the application to the users filesystem 

    // Get the path to the database in the application package 
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName]; 

    // Copy the database from the package to the users filesystem 
    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil]; 

    [fileManager release]; 
} 

あなたが内容を読むことができるように、モードを書き、ドキュメントディレクトリ上のファイル、内容が読み込まれ、このTutorial を参照することができますデータベースから。

関連する問題