1

ここで最初に NSDocumentDirectory でパスを検索する理由を知りたいと思っていました:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);  
NSString *documentsDirectory = [paths objectAtIndex:0];  
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"Sports.sqlite"];

後で、このパスを別のパスと比較します。今回は NSBundle の resourcePath を使用します。

NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] 
                                        stringByAppendingPathComponent:@"Sports.sqlite"];  
success = [fileManager copyItemAtPath:defaultDBPath
                               toPath:writableDBPath error:&error];

両者の違いは何ですか?

4

2 に答える 2

1

この状況では、(データベースを復元する必要がない限り、通常は1回だけ)データベースを読み取り専用バンドルからドキュメントディレクトリにコピーして、ユーザーがデータベースに読み取り/書き込みできるようにします。これは、データベースを事前にシードする場合、または構造を設定するだけの場合に便利です。

ドキュメントディレクトリは読み取り/書き込みであるため、正しく使用するためにディレクトリにをbundle持っている必要はありません。sqlitedocuments

  1. sqliteコードの最初の部分は、ファイルをディレクトリ内に配置する場所へのパスを取得することですdocuments。で開催されることになりwritableDBPathます。

  2. 次に、bundledefaultDBPath)からパスを取得し、2つのパスを使用して

    ... copyItemAtPath:defaultDBPath toPath:writableDBPath ...
    

これにより、バンドルで提供する読み取り/書き込みデータベースが提供されます。SQLスキーマを作成するためにデバイスで実行する代わりに、なぜこれを行うのですか?これにより、データベースにデータを事前にシードすることができます。グラフィカルツールを使用してsqliteファイルを設定および編集する方が簡単な場合があります

于 2011-07-09T12:46:53.027 に答える
1

2つのパスを「比較」するとはどういう意味ですか?

私が見ているのは、アプリ リソース ディレクトリからユーザー ドキュメント ディレクトリへのファイル コピーです。

そのため、アプリにバンドルされる (したがって、リソース ディレクトリで利用できる)の既定のバージョンがSports.sqlite、ユーザーが変更できるユーザー ディレクトリにコピーされます。

コードの最初のチャンクは、宛先パス (文字列) を構築するだけです。2 番目のチャンクはソース パス (文字列) を作成し、コピーを作成します。

それは理にかなっていますか?

于 2011-07-09T10:38:26.497 に答える