1

私はiOS用のドロップボックスAPIを使用しており、loadDelta関数をいじっています。送信された「キー」全体を取得し、構造がどのように設定されているかを取得します(このコードの下を参照)が、送信されたファイルをダウンロードする方法と、それをiOS デバイス。誰もこれを行う方法について洞察を持っていますか?

-(void)restClient:(DBRestClient *)client loadedDeltaEntries:(NSArray *)entries reset:(BOOL)shouldReset cursor:(NSString *)cursor hasMore:(BOOL)hasMore{
    for (DBDeltaEntry *file in entries) {
         if(!file.metadata.isDirectory){
             NSLog(@"File: %@ ", file.metadata.filename );
         }else {
             NSLog(@"Directory: %@  ", file.metadata.filename );
         }
     }
}

この呼び出しは、entries という配列を返します。エントリの各エントリは次のとおりです。

    @interface DBDeltaEntry : NSObject {
        NSString *lowercasePath;
        DBMetadata *metadata;
    }

DBMetadata オブジェクトは次のとおりです。

@interface DBMetadata : NSObject <NSCoding> {
    BOOL thumbnailExists;
    long long totalBytes;
    NSDate* lastModifiedDate;
    NSDate *clientMtime; // file's mtime for display purposes only
    NSString* path;
    BOOL isDirectory;
    NSArray* contents;
    NSString* hash;
    NSString* humanReadableSize;
    NSString* root;
    NSString* icon;
    NSString* rev;
    long long revision; // Deprecated; will be removed in version 2. Use rev whenever possible
    BOOL isDeleted;

    NSString *filename;
}

私が理解できないのは、オフライン構造を再帰的にセットアップする方法、またはそうするためのベストプラクティスです。ただし、デルタを使用すると、更新目的で保存したファイルのデータベースを保持する必要はありませんよね?

4

2 に答える 2

2

/delta 呼び出しは、何が変更されたかを通知するだけです。それ自体では、ファイルの内容にアクセスできません。/delta から聞いた特定のファイルをダウンロードする場合は、ファイルをダウンロードするために /files (GET) 呼び出しで指定されたパスを使用する必要があります: https://www.dropbox.com/developers/reference /api#files-GET (iOS SDK は、これを loadFile 関数として使用できるようにします。)

/delta 呼び出しを使用すると、/metadata を呼び出して何が変更されたかを手動で把握し、現在の状態を追跡する手間を省くことができますが、Dropbox API のベスト プラクティス ( https://www.dropbox.com/developers /reference/bestpractice ) ユーザーが要求するまで何もダウンロードしないでください。

于 2012-05-21T21:46:48.230 に答える
0

1 つのスキームは、次の列を持つ SQLite テーブルを使用することです。

  • lc_path: ファイルの小文字のパス (このテーブルの主キー)
  • name: ファイルの名前
  • lc_parent_path: 親フォルダーの小文字のパス
  • その他のメタデータ... (最終更新日、リビジョン、is_dir など)

したがって、「追加」/deltaエントリを処理するときは、テーブルに行を挿入します (既存の行を置き換える必要がある場合があります)。

パス /a/b/c の「削除」エントリを処理するときは、すべての子も削除する必要があるため、実行しDELETE ... WHERE lc_path = "/a/b/c"てからDELETE ... WHERE lc_path LIKE "/a/b/c/%".

フォルダ "/a/b/c" の直接の子のリストをデータベースに照会する場合は、次のようにします。SELECT ... WHERE lc_parent_path = "/a/b/c"

パスが多少重複して保存されていることに気付いたかもしれません ( lc_parent_path+namelc_path)。これはおそらく問題ないでしょう。しかし、データベースが大きすぎて、ほとんどのスペースがパス文字列の保存に使用されていることがわかった場合は、エンコードのトリックを実行できます。

于 2012-06-28T16:26:12.020 に答える