Можно ли получить дату последнего изменения из файла активов?

Странный вопрос: можно ли получить дату последнего изменения файла в папке с ресурсами, или это было бы бессмысленно и невозможно?

Я спрашиваю, потому что я копирую базу данных только для чтения оттуда в папку данных при запуске приложения, но предпочитаю выполнять копию только в том случае, если существующий файл старше, чем файл, хранящийся в папке ресурсов (или если файл не существует).

Если это невозможно, кто-нибудь знает о лучшем соглашении? Я могу опубликовать это в отдельном вопросе, если это необходимо. ТИА!


person Nathan Fig    schedule 09.03.2011    source источник
comment
Для тех, кто хочет знать: ответ - нет. Я сам прибегал к соглашению об именах версий и регулярным выражениям для разбора и определения версии файла.   -  person Nathan Fig    schedule 12.03.2011
comment
можешь подробнее описать, как ты это сделал, пожалуйста?   -  person Ewoks    schedule 11.02.2013


Ответы (4)


Насколько велика/сложна база данных? Возможно, вам будет проще и гибче использовать экземпляр SQLiteOpenHelper чтобы справиться с этим с помощью одного вызова getReadableDatabase()< /a>, при необходимости он создаст базу данных и вызовет ваш onUpgrade для обновления базы данных.

Все, что вам нужно сделать, это предоставить onCreate() для создания базы данных укажите onUpgrade() для обновления и увеличения версии базы данных (в onUpgrade()), когда он изменится, и Android выполнит создание и обновление базы данных для вас.

В качестве альтернативы (и я этого не пробовал) это выглядит как AssetManager.list() может предоставить вам список путей к вашим ресурсам, затем используйте File (String path), чтобы получить объект File для базы данных, и, наконец, File.lastModified(), чтобы получить дату изменения.

person RivieraKid    schedule 09.03.2011
comment
Я уже расширяю SQLiteOpenHelper, но не хотел включать версию базы данных в код или XML, если это возможно — мне нужен был способ сравнить сами базы данных. В качестве альтернативы, я полагаю, я мог бы сохранить версию в базах данных, но тогда мне пришлось бы каждый раз копировать новую базу данных в папку данных, просто чтобы открыть ее и посмотреть, насколько она новая, поэтому я мог бы также перезаписать существующую в каждом кейс. - person Nathan Fig; 09.03.2011
comment
О, и я почти уверен, что вы не можете открыть файл из AssetManager, я думаю, что это должен быть InputStream. Но может я ошибаюсь? - person Nathan Fig; 09.03.2011
comment
Нет, на самом деле я думаю, что ты прав. К сожалению, похоже, что вам придется хранить какой-то флаг в общих настройках или в базе данных, чтобы определить, нужно ли перезаписывать используемую базу данных. - person RivieraKid; 09.03.2011
comment
Круто, я прибегнул к соглашению об именах версий. Спасибо, что нашли время. - person Nathan Fig; 12.03.2011

Привет, у меня была та же проблема, что и у тебя. Я хотел скопировать и активировать, только если он был новее. Поэтому я сделал хранилище 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();

Вероятно, это проще, чем использовать имена версий в самом файле.

Обратите внимание, что файлы копирования будут запускаться при первом открытии приложения, если у вас версия выше 0.0, и будут запускаться снова, только если вы увеличите строку версии в более поздних версиях.

Имейте в виду, что этот пример работает только в том случае, если у вас есть один файл для сравнения или вам не нужны версии отдельных файлов. В противном случае вы можете использовать несколько разных строк для хранения версий файлов.

person M Granja    schedule 27.05.2011

Для ресурса только для чтения я попытался использовать отметку времени файла (f.lastModified() / f.setSetModified(timestamp)), и это не сработало, потому чтоf.setSetModified(timestamp) не работает на Android. По крайней мере, на той 2.3.4, которую я использовал.

См. https://stackoverflow.com/a/13996418/755804.

person 18446744073709551615    schedule 27.12.2012

Я создал задачу сборки, которая сохраняет даты последнего изменения всех файлов ресурсов и сохраняет их в новый файл lastModified.txt в каталоге ресурсов. Просто поместите это внизу вашего build.gradle. Дважды проверьте путь к каталогу вашего ресурса.

task saveAllAssetDate {
    def assetDirectory = "src/main/assets";
    def text = ""
    fileTree(assetDirectory).visit { FileVisitDetails details ->
        def name = details.file.path;
        name = name.substring(name.indexOf("assets"));
        text += details.getLastModified() + " " + name + "\n"
    }
    file(assetDirectory + "/lastModified.txt").text = "" + text
}
build.dependsOn saveAllAssetDate
person Eric Farng    schedule 15.11.2018