2

ソース パスとして直接リンクを使用して Dropbox から sqlite データベースをダウンロードし、それをアプリのドキュメント ファイルに保存しようとしています。アプリを更新せずにデータベースを更新する手段にすぎません。

ダウンロードする前にファイルが存在するかどうかを確認すると、ファイルが表示されません。

NSFileManager *fileManager = [NSFileManager defaultManager];

NSString *sourceDBPath = @"https://www.dropbox.com/s/868vvg7uremst9n/Data.sqlite?dl=1";

if ([fileManager fileExistsAtPath:sourceDBPath])
{

NSData *dbFile = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"https://www.dropbox.com/s/868vvg7uremst9n/Data.sqlite?dl=1"]];

NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle]  resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents"]];

NSString *filePath = [resourceDocPath stringByAppendingPathComponent:@"Database.sqlite"];


[dbFile writeToFile:filePath atomically:YES];
}

ファイルへの直接リンクを使用している場合でも、Dropbox SDK をアプリに統合する必要がありますか?

4

1 に答える 1

1

リンクは確かに機能しています。いいえ、これが機能するために Dropbox とアプリをリンクする必要はありません。

https と ios にはいくつかの問題があり、詳細は次のとおりです。

iOS 5 の TLS 実装は、TLS プロトコル バージョン 1.2 をサポートするようにアップグレードされました。一部の非準拠 TLS サーバー実装は TLS 1.2 を実装しておらず、さらに重要なことに、サポートされているプロトコル バージョンに正常にダウングレードしません。その結果、iOS 5 SDK に対してビルドされた一部の TLS クライアント アプリケーションは、以前のバージョンの iOS SDK に対してビルドされた同じアプリケーションが接続するときに、一部の TLS サーバーに接続しない場合があります。

からの抜粋...

アップデート。

ただし、次のコードを使用して取得しようとしました。

NSString *dropboxHttpsUrl = @"https://www.dropbox.com/s/868vvg7uremst9n/Data.sqlite?dl=1";
NSData *dbFile = [[NSData alloc] initWithContentsOfURL:
                      [NSURL URLWithString:dropboxHttpsUrl]];

if(dbFile) {
   NSLog(@"%i", [dbFile length]);
   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
   NSString *documentsDirectory = [paths objectAtIndex:0];
   NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"test.db"];
   [dbFile writeToFile:appFile atomically:YES];
   NSLog(@"%@", appFile);
}else{
   NSLog(@"nothing got retrieved");
}

そして、データベースを取得して、空のExampleテーブルとスキーマを確認できました。

より標準的な方法でドキュメント パスを構築するだけです。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"test.db"];

してはいけないこと:

NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle]  resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents"]];

おそらく間違った場所に保存されているか、さらに悪いことに、まったく保存されていないのはこれです。

于 2012-12-22T06:14:42.730 に答える