奇怪的问题:是否有可能在资产文件夹中获取文件的最后修改日期,或者这是毫无意义且不可能的?
我问,因为我在应用程序启动时将一个只读数据库复制到数据文件夹中,但是如果现有文件比存储在assets文件夹中的文件旧,则只执行复制(或者如果文件不存在)。
如果那不可能,有人知道更好的约定吗?如果需要,我可以在一个单独的问题中发布。 TIA!
答案 0 :(得分:3)
数据库有多大/多复杂?您可能会发现使用SQLiteOpenHelper
实例来处理此问题更容易,也更灵活,因为只需调用getReadableDatabase()
,它就会创建必要的数据库,并调用onUpgrade
进行升级你的数据库。
您所需要做的就是提供onCreate()
来创建数据库,提供onUpgrade()
进行升级,并在数据库版本发生变化时增加数据库版本(在onUpgrade()
中)并且Android将处理为您创建和升级数据库。
或者,(我还没试过),看起来AssetManager.list()
可以为您提供资产路径列表,接下来,使用File (String path)
获取数据库的File对象,最后File.lastModified()
获取修改日期。
答案 1 :(得分:2)
我在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,则复制文件将在第一次打开应用程序时运行,并且只有在更高版本中增加版本字符串时才会再次运行。
请记住,此示例仅在您有一个要比较的文件或不关心单个文件版本时才有效。否则,您可以使用几个不同的字符串来存储文件版本。
答案 2 :(得分:1)
对于只读资源,我尝试使用文件时间戳(f.lastModified()
/ f.setSetModified(timestamp)
),而 无法正常工作 ,因为f.setSetModified(timestamp)
无法在Android上运行。至少,在我使用的2.3.4上。
答案 3 :(得分:0)
我创建了一个构建任务,该任务保存所有资产文件的最后修改日期,并将其保存到资产目录中的新文件<%= stylesheet_link_tag "application", media: "all" %>
<%= javascript_include_tag "application" %>
中。只需将其放在lastModified.txt
的底部即可。仔细检查资产目录的路径。
build.gradle