Android使用DropBox Sync API同步一个文件

时间:2014-12-13 13:47:58

标签: android synchronization dropbox sync

大家下午好。
我有非常简单的笔记应用程序,我想做一个简单的事情 - 在用户的需求应用程序应该将其“notes_db”文件与云中的版本同步
(在第一阶段,我想同步整个“notes_db”文件,以简化)。

由于我还不熟练使用其API编写我自己的网络服务器,因此我决定使用DropBox Sync API。 此时我已在我的应用程序中成功实现了用户授权 我想,我会指出“notes_db”文件并说“同步这个文件!”同步API - 此文件将同步到云。
但现在对我来说并不容易: - (。

我的第一个问题是 - 我是否理解正确,我无法通过DropBox Sync API同步我想要同步的特定文件(在我的情况下,这是位于“/ databases / notes_db”的文件)?
第二个问题 - 在这种情况下,同步机制应该是什么?

我的猜测是我应该做下一个 (我想我将有3个版本的“notes_db”文件 - 本地(我的应用程序将进行更改),本地缓存和云版本):
1)在DropBox文件系统中创建空文件“notes_db”(如果我理解正确,它将创建本地缓存和云版本)或尝试打开它(如果存在);
2)将本地版本的内容传输到刚创建的本地缓存版本;
3)调用一些方法(哪些?)来同步从本地缓存到云版本的变化。

然后,在下一次同步通话中:
1)比较文件 - 云,本地缓存和本地版本;
2)如果本地版本是最新版本 - 将其内容传输到本地缓存版本并开始同步;
3)如果云版本是最新版本 - 将其置于本地缓存中并将其内容传输到本地版本的文件。

另外 - 创建DropBox文件系统后,我应该调用哪些方法? hasSynced(),listFolder(),awaitFirstSync(),syncNowAndWait(),getSyncStatus()?
说实话,我现在完全对它感到困惑。

或者可能有一种更简单的方法来解决我的问题 - 无论是通过DropBox Sync API还是以其他方式解决?

如果有人可以提供有用的教程或同步一个文件的工作示例 - 我将非常感激。

感谢您的帮助! 这个问题对我来说非常重要。

1 个答案:

答案 0 :(得分:0)

好的,朋友们 仍然不知道,这是解决我的问题的最佳方式,但它正在解决我的问题。
基于机制,如上所述:

第一步。
获取dbxFileSystem(假设我们已经有linkedAccount)和 决定 ,需要执行以下操作:

try {
   dbxFileSystem = DbxFileSystem.forAccount(mDbxAcctMgr.getLinkedAccount());
   if (dbxFileSystem.exists(dbxPath)) {
      dbxFile = dbxFileSystem.open(dbxPath);
      if (_myNotesQuantityCount == 0) {
         try {
            writeFromCloud(dbxFile.getReadStream());
         } catch (IOException e) {
              Toast.makeText(error text).show();
         }
      }
      else {
         writeToCloud();
      }
   }
   else () {
      dbxFile = dbxFileSystem.create(dbxPath);
      writeToCloud();
   }
}

第二步。
执行所需操作:
将本地文件写入云版

public void writeToCloud() {
        try {
            dbxFile.writeFromExistingFile(_localDBLocation, false);
        } catch (IOException e) {
            Toast.makeText(error text).show();
        } finally {
            dbxFile.close();
        }
    }

将云版本写入本地文件

public void writeFromCloud(FileInputStream inputStream) {
        try {
            outputStream = new FileOutputStream(_localDBLocation);
            byteBuffer = new byte[1024];
            int length;
            try {
                while ((length = inputStream.read(byteBuffer)) > 0) {
                    outputStream.write(byteBuffer,0,length);
                }
                outputStream.flush();
                outputStream.close();
            } catch (IOException e) {
                Toast.makeText(this, error text).show();
            } finally {
                dbxFile.close();
            }
        } catch (FileNotFoundException e) {
            Toast.makeText(error text).show();
        } finally {
            dbxFile.close();
        }
    }

我遇到的一个问题是与云的同步不是即时的 我想正确的方法是为文件更改设置监听器,但我只是稍微暂停了我的线程并再次调用同步(SOF上有一个关于调用两次的问题)。

现在它正在工作! 无论如何,如果有人有改进或更好的解决方案 - 我很高兴听到它。