2014-12-13 2 views
0

Добрый день всем.
У меня довольно простое приложение для заметок, и я хочу сделать простую вещь - по требованию пользователя приложение должно синхронизировать свой файл «notes_db» с версией в облаке
(на первом этапе я хочу синхронизировать весь файл «notes_db», для упрощения).Android с помощью DropBox Sync API для синхронизации одного файла

Поскольку я еще недостаточно умел писать свой собственный веб-сервер с его API, было принято решение использовать DropBox Sync API для моих целей.
В этот момент я успешно выполнил авторизацию пользователя в своем приложении.
И я предположил, что я укажу файл «notes_db» и скажу «Синхронизировать этот файл!». to Sync API - и этот файл будет синхронизирован с облаком.
Но теперь это не так просто :-(

Мой первый вопрос: правильно ли я понимаю, что я не могу синхронизировать определенный файл, который я хочу синхронизировать (в моем случае, это файл, расположенный в «/ баз данных/notes_db») через DropBox Sync API
И второй вопрос - каким должен быть механизм синхронизации в этом случае

Я думаю, что я должен сделать следующий
(I? предположим, что у меня будет 3 версии файла notes_db - локальный (где мое приложение внесет изменения), локальный кеш и облачная версия):
1) создать пустой файл «notes_db» в Dr opBox (если я правильно понимаю, он будет создавать как локальный кеш, так и облачные версии) или попытаться открыть его, если он существует;
2) переносить содержимое локальной версии только в созданную локальную версию кеша;
3) вызвать некоторые методы (которые?), Чтобы синхронизировать изменения из локального кеша в облачную версию.

Затем, при следующем вызове синхронизации:
1) сравнить файлы - облако, локальный кеш и локальные версии;
2) если локальная версия является самой новой - передайте ее содержимое в локальную версию кеша и запустите синхронизацию;
3) если облачная версия является самой новой - получите ее в локальном кеше и передайте ее содержимое в локальную версию файла.

Кроме того, после создания DropBox-файловой системы, какие методы мне следует называть? hasSynced(), listFolder(), awaitFirstSync(), syncNowAndWait(), getSyncStatus()?
Говоря честно, я сейчас полностью смущен.

Может быть, есть более простой способ решить мою проблему - независимо от того, через DropBox Sync API или каким-либо другим способом?

Если кто-то может предоставить полезный учебник или рабочий пример с синхронизацией одного файла - я был бы очень благодарен за это.

И спасибо за помощь!
Этот вопрос для меня действительно важен.

ответ

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 был вопрос о вызове дважды).

Теперь это работает! В любом случае, если у кого-то есть что-то для улучшения или лучшего решения - я был бы рад это услышать.

+0

Хорошо, он все еще работает. Добавлен AsyncTask для всех синхронных операций, поэтому основной пользовательский интерфейс является бесплатным. –

Смежные вопросы