После экспорта или импорта библиотека Realm не может найти объекты Realm

Для экспорта моего файла области я использую следующий код:

File exportRealmFile;
            exportRealmFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "default.realm");
getRealm().writeCopyTo(exportRealmFile);

После этого я пытаюсь импортировать этот файл. Я открываю Android Monitor и загружаю файл на другое устройство.

Но когда я хочу получить RealmObject, например, StatObject, я вижу, что размер объекта равен 0. Но я знаю, что размер не равен 0.

 RealmResults<StatObject> statObjects =
                                realmForThisThread.where(StatObject.class).findAll();
LOG.debug("Size "+statObjects.size());

Открываю Stetho и не вижу никаких объектов! Но перед экспортом я видел семь объектов разных миров. Однако сама библиотека имеет такой же размер. Что я делаю не так?

Я пытаюсь импортировать файл области, используя:

        RealmConfiguration realmConfiguration = new RealmConfiguration.Builder()
                .name("Realmexport.realm")
                .assetFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath())
                .build();
       // Realm.setDefaultConfiguration(realmConfiguration);

Но ничего не изменилось.

Импортировать файл:

File oldRealmFile = new File(getRealm().getPath());
File newFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) ,"default.realm");
 FileOutputStream outputStream=null;
 FileInputStream inputStream=null;
 try {
     outputStream = new FileOutputStream(oldRealmFile);
     inputStream = new FileInputStream(newFile);
     byte[] buf = new byte[1024];
     int bytesRead;
     while ((bytesRead = inputStream.read(buf)) > 0) {
        outputStream.write(buf, 0, bytesRead);
     }
     outputStream.close();
     inputStream.close();
     }catch (IOException exc){
             exc.printStackTrace();
     }finally {
     }

Этот подход помогает импортировать файл, но новый файл я не могу использовать. Потому что я не вижу свои объекты.


person Delphian    schedule 01.08.2017    source источник
comment
Как вы импортируете экспортированное Царство? можешь поделиться всем кодом? Я подозреваю, что вы просто открываете новое Царство (отсюда и размер 0), поскольку вы не перемещаете экспортированное Царство в правильное место. Кроме того, вы можете отправить экспортированный Realm, используя assets, а затем указать его в RealmConfiguration, чтобы убедиться, что вы используете правильный файл. RealmConfiguration config = new RealmConfiguration.Builder() .assetFile("myExported.realm") .build();   -  person Nabil Hachicha    schedule 02.08.2017
comment
Я сделал это двумя способами: первый - я нашел свой файл Realm в пакете приложения с помощью Android Monitor и изменил их; второй способ, которым я нашел свой файл области, код: File realmFile = new File(getRealm().getPath()), а затем написал новый файл, используя outputStream и InputStream. В обоих вариантах я вижу новый файл области, но не могу его использовать.   -  person Delphian    schedule 02.08.2017
comment
Вы можете попробовать подход assetFile?   -  person Nabil Hachicha    schedule 03.08.2017
comment
Набиль, я писал выше о таком подходе. Файл не перезаписывается. Я вижу тот же файл.   -  person Delphian    schedule 04.08.2017
comment
Я добавил выше, как я могу импортировать файл, но я не вижу свои объекты после этого импорта.   -  person Delphian    schedule 04.08.2017


Ответы (2)


Вы используете assetFile неправильным образом. Вы ссылаетесь на внутреннее расположение устройства .assetFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath()), тогда как экспортированное Realm должно находиться в папке assets вашего APK. Также указание name создаст новую (пустую) область.

Вместо этого попробуйте следующую конфигурацию.

RealmConfiguration config = new RealmConfiguration.Builder().assetFile("myExported").build();

Ваш АПК:

└── src └── main ├── AndroidManifest.xml ├── assets │   └── myExported.realm ├── java └── res

person Nabil Hachicha    schedule 04.08.2017
comment
Я не могу добавить этот файл в папку активов, потому что этот каталог имеет только разрешение на чтение и ограничение в 10 МБ. Я загружаю новый файл Realm из Firebase и помещаю его в DCIM или кеш, это не имеет значения. - person Delphian; 04.08.2017
comment
Вам нужно отправить файл myExported.realm в папку assets перед сборкой APK. Не пытайтесь adb push файл после установки APK. - person Nabil Hachicha; 04.08.2017
comment
Это не имеет никакого смысла. Моя задача, чтобы пользователи в реальном времени обменивались базами реалмов, отправляя их друг другу. - person Delphian; 04.08.2017

.assetFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath())

должно быть

.directory(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM))
person EpicPandaForce    schedule 04.08.2017