奇妙な質問: assets フォルダー内のファイルの最終更新日を取得することは可能ですか?それとも無意味で不可能でしょうか?
アプリケーションの起動時にそこから読み取り専用データベースをデータフォルダーにコピーしているため、質問しますが、既存のファイルがアセットフォルダーに保存されているファイルよりも古い場合にのみコピーを実行します (またはファイルが存在しません)。
それが不可能な場合、より良い慣習を知っている人はいますか? 必要に応じて別の質問に投稿できます。ティア!
奇妙な質問: assets フォルダー内のファイルの最終更新日を取得することは可能ですか?それとも無意味で不可能でしょうか?
アプリケーションの起動時にそこから読み取り専用データベースをデータフォルダーにコピーしているため、質問しますが、既存のファイルがアセットフォルダーに保存されているファイルよりも古い場合にのみコピーを実行します (またはファイルが存在しません)。
それが不可能な場合、より良い慣習を知っている人はいますか? 必要に応じて別の質問に投稿できます。ティア!
データベースの大きさ/複雑さは? のインスタンスを使用してこれを処理する方が簡単で柔軟な場合があります。SQLiteOpenHelper
これは、 を 1 回呼び出すだけでgetReadableDatabase()
、必要に応じてデータベースが作成さonUpgrade
れ、データベースをアップグレードするために your が呼び出されるためです。
onCreate()
データベースを作成するために を提供しonUpgrade()
、アップグレードするために提供し、データベースのバージョンが変更されたときに ( で) 増分するonUpgrade()
だけで、Android がデータベースの作成とアップグレードを処理します。
または、(私はこれを試していません)、AssetManager.list()
アセットへのパスのリストを提供し、次にFile (String path)
データベースの File オブジェクトをFile.lastModified()
取得し、最後に変更日を取得できるようです。
ねえ、私はあなたと同じ問題を抱えていました。それが新しい場合にのみ、コピーして資産にしたかったのです。そこで、最後にインストールされたバージョンを sharedPreferences ストアに格納し、それを使用して日付を比較しました。
アプリケーションのバージョンを保持するために、strings.xml ファイルにエントリを追加します。
<string name="version">0.3</string>
次に、メイン クラスの onCreate メソッドに if 句を追加します。
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
if( Float.parseFloat(getString(R.string.version)) > prefs.getFloat("LastInstalledVersion", (float) 0.0 ) ) {
copyfiles();
}
そして、新しいバージョン文字列を onPause メソッドの sharedPreferences に追加します。これにより、onCreate が再度呼び出される前に確実に追加されます。
SharedPreferences prefs= PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = prefs.edit();
editor.putFloat("LastInstalledVersion", Float.parseFloat(getString(R.string.version)) );
editor.commit();
おそらく、ファイル自体でバージョン名を使用するよりも簡単です。
バージョンが 0.0 以上の場合、copyfiles はアプリケーションを初めて開いたときに実行され、それ以降のバージョンでバージョン文字列を増やした場合にのみ再度実行されることに注意してください。
この例は、比較するファイルが 1 つしかない場合、または個々のファイルのバージョンを気にしない場合にのみ機能することに注意してください。それ以外の場合は、いくつかの異なる文字列を使用してファイル バージョンを保存できます。
読み取り専用アセットの場合、ファイルのタイムスタンプ ( f.lastModified()
/ f.setSetModified(timestamp)
)を使用しようとしましたが、Android では機能しないため機能しませんでした。f.setSetModified(timestamp)
少なくとも、私が使用した 2.3.4 では。
すべてのアセット ファイルの最終更新日を保存し、それを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