【问题标题】:Android using DropBox Sync API to synchronize one fileAndroid 使用 DropBox Sync API 同步一个文件
【发布时间】:2014-12-13 13:47:57
【问题描述】:

大家下午好。
我有一个非常简单的笔记应用程序,我想做简单的事情 - 根据用户的需求,应用程序应该将其“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 还是其他方式?

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

感谢您的帮助!
这个问题现在对我来说真的很重要。

【问题讨论】:

    标签: android synchronization dropbox sync


    【解决方案1】:

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

    第一步。
    获取 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 上有一个关于调用两次的问题)。

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

    【讨论】:

    • 好的,它仍然有效。为所有同步操作添加了 AsyncTask,因此主 UI 是免费的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多