奇怪的问题:是否有可能在资产文件夹中获取文件的最后修改日期,或者那将是毫无意义和不可能的?
我问是因为我在应用程序启动时将只读数据库从那里复制到数据文件夹中,但宁愿仅在现有文件比资产文件夹中存储的文件旧时执行复制(或者如果文件不存在)。
如果那不可能,有人知道更好的约定吗?如果需要,我可以将其发布在一个单独的问题中。蒂亚!
奇怪的问题:是否有可能在资产文件夹中获取文件的最后修改日期,或者那将是毫无意义和不可能的?
我问是因为我在应用程序启动时将只读数据库从那里复制到数据文件夹中,但宁愿仅在现有文件比资产文件夹中存储的文件旧时执行复制(或者如果文件不存在)。
如果那不可能,有人知道更好的约定吗?如果需要,我可以将其发布在一个单独的问题中。蒂亚!
数据库有多大/复杂?您可能会发现使用 的实例SQLiteOpenHelper
来处理这个更容易和更灵活,因为只需一次调用getReadableDatabase()
,它会在必要时创建数据库,并调用您onUpgrade
来为您升级数据库。
您所要做的就是提供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 将在第一次打开应用程序时运行,并且仅当您在以后的版本中增加版本字符串时才会再次运行。
请记住,此示例仅在您要比较单个文件或不关心单个文件版本时才有效。否则,您可以使用几个不同的字符串来存储文件版本。
对于只读资产,我尝试使用文件时间戳 ( f.lastModified()
/ f.setSetModified(timestamp)
),但它不起作用,因为f.setSetModified(timestamp)
在 Android 上不起作用。至少,在我使用的 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