Возможно ли получить последнюю измененную дату из файла активов?
Необычный вопрос: возможно ли получить последнюю измененную дату файла в папке с активами, или это было бы бессмысленным и невозможным?
Я спрашиваю, потому что я копирую базу данных только для чтения оттуда в папку данных при запуске приложения, но скорее предпочту только выполнить копию, если существующий файл старше, чем тот, который хранится в папке с ресурсами (или если файл не существует).
Если это невозможно, кто-нибудь знает о лучшей конвенции? Я могу опубликовать это в отдельном вопросе, если это необходимо. ТИА!
Ответы
Ответ 1
Насколько велика/сложна база данных? Возможно, вам будет проще и гибче использовать экземпляр SQLiteOpenHelper
, чтобы обработать это, поскольку с помощью одного вызова getReadableDatabase()
, он создаст при необходимости базу данных и вызовет onUpgrade
, чтобы обновите базу данных для вас.
Все, что вам нужно сделать, это предоставить onCreate()
для создания базы данных, предоставить onUpgrade()
обновить и увеличить версию базы данных (в onUpgrade()
), когда она изменится, и Android будет создайте и обновите базу данных для вас.
В качестве альтернативы (и я не пробовал это), он выглядит как AssetManager.list()
может предоставить вам список путей к вашим активам, затем используйте File (String path)
, чтобы получить объект File для базы данных, и, наконец, File.lastModified()
, чтобы получить измененную дату.
Ответ 2
Эй, у меня была такая же проблема, как и у вас. Я хотел копировать и использовать активы только в том случае, если он был более новым. Поэтому я сделал хранилище sharedPreferences последней установленной версией и использовал это для сравнения дат:
Я добавляю запись в файл strings.xml для хранения версии приложения:
<string name="version">0.3</string>
Затем я помещаю предложение if в метод onCreate основного класса:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
if( Float.parseFloat(getString(R.string.version)) > prefs.getFloat("LastInstalledVersion", (float) 0.0 ) ) {
copyfiles();
}
И я добавляю строку новой версии в sharedPreferences в методе onPause, таким образом, она будет добавлена точно, прежде чем функция onCreate будет вызвана еще раз:
SharedPreferences prefs= PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = prefs.edit();
editor.putFloat("LastInstalledVersion", Float.parseFloat(getString(R.string.version)) );
editor.commit();
Возможно, проще, чем использовать имена версий в самом файле.
Обратите внимание, что copyfiles будет запускаться при первом открытии приложения, если у вас есть версия выше 0.0, и будет работать снова, если вы увеличите строку версии в более поздних версиях.
Помните, что этот пример работает только в том случае, если у вас есть один файл для сравнения или не заботятся о отдельных версиях файлов. В противном случае вы можете использовать несколько разных строк для хранения версий файлов.
Ответ 3
Для ресурса только для чтения я попытался использовать временную метку файла (f.lastModified()
/f.setSetModified(timestamp)
), а не работает, потому что f.setSetModified(timestamp)
не работает на Android. По крайней мере, на 2.3.4, который я использовал.
См. fooobar.com/info/518971/...