Можно ли получить дату последнего изменения из файла активов? - PullRequest
13 голосов
/ 09 марта 2011

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

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

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

Ответы [ 4 ]

3 голосов
/ 09 марта 2011

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

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

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

2 голосов
/ 27 мая 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, и будут запускаться снова, если вы увеличите строку версии в более поздних версиях.

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

1 голос
/ 27 декабря 2012

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

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

0 голосов
/ 15 ноября 2018

Я создал задачу сборки, которая сохраняет даты последнего изменения всех файлов активов и сохраняет ее в новый файл 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...