在Dropbox API中使用Delta与iOS

时间:2012-05-21 19:28:03

标签: objective-c ios ios5 dropbox dropbox-api

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

该调用发回一个名为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;
}

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

2 个答案:

答案 0 :(得分:2)

/ delta调用仅告诉您更改了什么。它本身不会授予您对文件内容的任何访问权限。如果你想从/ delta下载你听到的任何特定文件,你应该使用它给你的路径/ files(GET)调用来下载文件:     https://www.dropbox.com/developers/reference/api#files-GET (iOS SDK使其可用作loadFile函数。)

/ delta调用确实可以省去必须调用/元数据以手动找出已更改内容并跟踪当前状态的麻烦,但请注意Dropbox API最佳做法(https://www.dropbox.com/developers/reference/bestpractice)确实说在用户要求之前你不应该下载任何东西。

答案 1 :(得分:0)

一种方案是使用带有以下列的SQLite表:

  • lc_path:文件的小写路径(此表的主键)
  • name:文件名
  • lc_parent_path:父文件夹的小写路径
  • 其他元数据......(最后修改,修订,is_dir等)

因此,在处理“add”/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)。这可能不是问题。但是如果你发现你的数据库太大而且大部分空间都用于存储路径字符串,那么你可以使用编码技巧。