Каков наилучший способ отправить весь файл .db с одежды Android на смартфон?

Теперь я делаю приложение для износа, которое записывает акселератор, магнитное поле, гироскоп (50 Гц) и записывает их в файл .db (который содержит 3 таблицы (ускорение, магнитное поле, гироскоп) с помощью SQLiteOpenHelper.

Раз в день я хотел бы отправить файл .db на свой КПК.

Я думаю, что лучше всего использовать DataApi, и я попытался заменить Realm на SQLite в этом коде (https://gist.github.com/tajchert/dc30560891bc6aee76fb).

В этом коде я думал, что эта часть

public static void syncRealm(Context context){
        File writableFolder = context.getFilesDir();
        File realmFile = new File(writableFolder, Realm.DEFAULT_REALM_NAME);
        Asset realAsset = Tools.assetFromFile(realmFile);
        new FileSender(realAsset, context).execute();
}

надо менять так

 public static void syncDB(Context context) {
    WearSqliteOpenHelper helper = new WearSqliteOpenHelper(context);
    String dbPath = helper.getReadableDatabase().getPath();
    File dbFile = new File(dbPath);
    Uri dbUri = Uri.fromFile(dbFile);
    Asset realAsset = Asset.createFromUri(dbUri);
    new FileSender(realAsset, context).execute();
  }

но я не знаю, как преобразовать (byte [] byteArray) в файл .db на портативном компьютере. (Какова альтернативная функция «toFile» ниже. Этот код также находится в https://gist.github.com/tajchert/dc30560891bc6aee76fb)

   private void toFile(byte [] byteArray){
        File writableFolder = ListenerService.this.getFilesDir();
        File realmFile = new File(writableFolder, Realm.DEFAULT_REALM_NAME);
        if (realmFile.exists()) {
            realmFile.delete();
        }
        try {
            FileOutputStream fos=new FileOutputStream(realmFile.getPath());
            fos.write(byteArray);
            fos.close();
        }
        catch (java.io.IOException e) {
            Log.d(TAG, "toFile exception: " + e.getLocalizedMessage());
        }
    }

Пожалуйста помогите!!!


person LittleWat    schedule 26.02.2016    source источник


Ответы (2)


В основном, шаги для этого следующие:

  1. Получите доступ к необработанному файлу БД на портативном устройстве (ваш исходный вопрос был правильным в этой части)
  2. Считайте этот файл в массив байтов (элегантный способ чтения файла в массив byte[] в Java, среди прочего)
  3. Отправьте ByteArray в Wear с помощью Data API (вероятно, в качестве актива: http://developer.android.com/training/wearables/data-layer/assets.html)
  4. Сохраните этот ByteArray обратно в путь БД на Wear (много примеров этого в Интернете, вот один: http://www.java2s.com/Code/Java/File-Input-Output/Readfiletobytearrayandsavebytearraytofile.htm)

Нет необходимости иметь дело с промежуточными файлами.

person String    schedule 27.02.2016
comment
Я очень ценю вашу нежную помощь! Сейчас попробую по вашей инструкции! - person LittleWat; 01.03.2016

Вы можете сохранить свою базу данных следующим образом

   try {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();

        if (sd.canWrite()) {
            String currentDBPath = "//data//{package name}//databases//{database name}";
            String backupDBPath = "{database name}";
            File currentDB = new File(data, currentDBPath);
            File backupDB = new File(sd, backupDBPath);

            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
            }
        }
    } catch (Exception e) {
    }

Затем вы можете отправить файл резервной копии на свое носимое устройство.

person Niza Siwale    schedule 26.02.2016
comment
Это действительно плохая практика - жестко указывать путь к базе данных таким образом; нет никакой гарантии, что любое данное устройство (или будущая версия Android) сохранит свою БД в одном и том же месте. Почему бы не использовать вызов, который предоставляет API: SQLiteDatabase.getReadableDatabase().getPath()? - person String; 26.02.2016
comment
Спасибо! FileChannel кажется очень полезным для копирования файла .db. но на самом деле я хотел бы знать, как отправить файл резервной копии Android Wear на смартфон и как получить файл db на смартфоне. Если вы знаете, я с нетерпением жду вашего ответа. - person LittleWat; 27.02.2016
comment
Если вы хотите восстановить базу данных на носимом устройстве, вы можете просто изменить вызов dst.transferFrom(src, 0, src.size()) на dst.transferTo(src,0,dst.size()); это восстановит базу данных. Что касается отправки базы данных, вы можете просто использовать Bluetooth для достижения этой цели. - person Niza Siwale; 27.02.2016
comment
Спасибо! Я знаю, как скопировать мой файл db! Теперь я должен отправить свой файл базы данных износа на портативное устройство с помощью Bluetooth! - person LittleWat; 01.03.2016