Question Est-il possible d'obtenir la dernière date de modification d'un fichier d'actifs?


Question bizarre: est-il possible d'obtenir la date de la dernière modification d'un fichier dans le dossier des actifs, ou serait-ce inutile et impossible?

Je demande parce que je copie une base de données en lecture seule de là dans le dossier de données au démarrage de l'application, mais préfère effectuer uniquement la copie si le fichier existant est plus ancien que celui stocké dans le dossier de ressources (ou si le fichier n'existe pas).

Si ce n'est pas possible, quiconque connaît une meilleure convention? Je peux poster cela dans une question séparée si nécessaire. TIA!


10
2018-03-09 15:34


origine


Réponses:


Quelle est la taille / la complexité de la base de données? Vous trouverez peut-être plus facile et plus flexible d'utiliser une instance de SQLiteOpenHelper pour gérer cela depuis avec un appel à getReadableDatabase(), il créera si nécessaire la base de données, et appellera votre onUpgrade mettre à niveau la base de données pour vous.

Tout ce que vous avez à faire est de fournir un onCreate() pour créer la base de données, fournir onUpgrade() pour mettre à jour et incrémenter la version de la base de données (dans onUpgrade()) quand il change et qu'Android se charge de créer et de mettre à niveau la base de données pour vous.

Alternativement, (et je n'ai pas essayé), il semble que AssetManager.list() peut vous fournir une liste de chemins d'accès à vos actifs, ensuite, utiliser File (String path) pour obtenir un objet File pour la base de données et enfin File.lastModified() pour obtenir la date de modification.


3
2018-03-09 16:08



Hé, j'avais le même problème que toi. Je voulais copier et valider que si c'était plus récent. J'ai donc fait en sorte que le sharedPreferences stocke la dernière version installée et l'a utilisée pour comparer les dates:

J'ajoute une entrée au fichier strings.xml pour contenir la version de l'application:

<string name="version">0.3</string>

Ensuite, je mets une clause if sur la méthode onCreate de la classe principale:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
if( Float.parseFloat(getString(R.string.version)) > prefs.getFloat("LastInstalledVersion", (float) 0.0 ) ) {
                copyfiles();
}

Et j'ajoute la nouvelle chaîne de version aux sharedPreferences sur la méthode onPause, de cette façon, elle sera ajoutée à coup sûr avant que onCreate soit appelée à nouveau:

SharedPreferences prefs= PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = prefs.edit();
editor.putFloat("LastInstalledVersion", Float.parseFloat(getString(R.string.version)) );
editor.commit();

Probablement plus simple que d'utiliser des noms de version dans le fichier lui-même.

Notez que les fichiers de copie seront exécutés lors de la première ouverture de l'application, si la version est supérieure à 0.0, et ne s'exécutera à nouveau que si vous augmentez la chaîne de version dans les versions ultérieures.

Gardez à l'esprit que cet exemple ne fonctionne que si vous avez un fichier unique à comparer ou si vous ne vous souciez pas des versions de fichiers individuelles. Sinon, vous pouvez utiliser plusieurs chaînes différentes pour stocker les versions de fichiers.


2
2018-05-27 12:54



Pour un actif en lecture seule, j'ai essayé d'utiliser l'horodatage du fichier (f.lastModified() / f.setSetModified(timestamp)), et cela n'a pas fonctionné carf.setSetModified(timestamp) ne fonctionne pas sur Android. Au moins, sur le 2.3.4 que j'ai utilisé.

Voir https://stackoverflow.com/a/13996418/755804


0
2017-12-27 05:59