1

我正在使用适用于 iOS 的 Dropbox 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 );
         }
     }
}

该调用发回一个称为条目的数组。条目中的每个条目是这样的:

    @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;
}

我想不通的是如何递归地设置我的离线结构或这样做的最佳实践。不过,我的假设是,使用 delta,我不需要保留我为更新目的而保存的文件的数据库,对吗?

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

一种方案是使用具有以下列的 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 回答