是否可以从资产文件中获取最后修改日期?

时间:2011-03-09 15:34:08

标签: android sqlite assets last-modified

奇怪的问题:是否有可能在资产文件夹中获取文件的最后修改日期,或者这是毫无意义且不可能的?

我问,因为我在应用程序启动时将一个只读数据库复制到数据文件夹中,但是如果现有文件比存储在assets文件夹中的文件旧,则只执行复制(或者如果文件不存在)。

如果那不可能,有人知道更好的约定吗?如果需要,我可以在一个单独的问题中发布。 TIA!

4 个答案:

答案 0 :(得分:3)

数据库有多大/多复杂?您可能会发现使用SQLiteOpenHelper实例来处理此问题更容易,也更灵活,因为只需调用getReadableDatabase(),它就会创建必要的数据库,并调用onUpgrade进行升级你的数据库。

您所需要做的就是提供onCreate()来创建数据库,提供onUpgrade()进行升级,并在数据库版本发生变化时增加数据库版本(在onUpgrade()中)并且Android将处理为您创建和升级数据库。

或者,(我还没试过),看起来AssetManager.list()可以为您提供资产路径列表,接下来,使用File (String path)获取数据库的File对象,最后File.lastModified()获取修改日期。

答案 1 :(得分:2)

嘿,我和你有同样的问题。我想复制和资产只是在它更新的时候。所以我让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,则复制文件将在第一次打开应用程序时运行,并且只有在更高版本中增加版本字符串时才会再次运行。

请记住,此示例仅在您有一个要比较的文件或不关心单个文件版本时才有效。否则,您可以使用几个不同的字符串来存储文件版本。

答案 2 :(得分:1)

对于只读资源,我尝试使用文件时间戳(f.lastModified() / f.setSetModified(timestamp)),而 无法正常工作 ,因为f.setSetModified(timestamp)无法在Android上运行。至少,在我使用的2.3.4上。

请参阅https://stackoverflow.com/a/13996418/755804

答案 3 :(得分:0)

我创建了一个构建任务,该任务保存所有资产文件的最后修改日期,并将其保存到资产目录中的新文件<%= stylesheet_link_tag "application", media: "all" %> <%= javascript_include_tag "application" %> 中。只需将其放在lastModified.txt的底部即可。仔细检查资产目录的路径。

build.gradle