安装新应用时资产文件夹未升级

Assets folder not upgraded when installing new app

我有一个应用程序,在 "assets" 文件夹中有一个 .db(sql 数据库)。 当我需要更新这个数据库时,我只需将新版本复制到 "assets" 文件夹中,更改 .db 文件的用户版本并重建 apk。在运行时,应用程序删除内存中的文件并准确复制 "assets" 文件夹中的文件,然后它检查此文件的版本是否大于它在内存中(在另一个数据库中)的最后一个版本,并且在在那种情况下,它会做一些事情(我正在跳过,因为这不是问题的重点)。

问题是:我的应用程序似乎忽略了这个新文件,将旧文件保留在 "assets" 文件夹中,因此自然不会检测到任何变化。 我的新文件似乎没有出现在 apk 中,但只出现在 Android 9.

的设备中

我丢失的资产文件夹的使用是否发生了变化? 如何在打包和升级时任意更新我的apk中的文件?

这个过程适用于旧设备,然后我不得不将目标 sdk 版本升级到 28,我在 Android 9 (Pie) 设备上测试时遇到了这个问题。

这里我删除旧文件:

File l_DatabaseDir = p_Context.getDir("Database", Context.MODE_PRIVATE);
File l_DatabaseFile = new File(l_DatabaseDir, "MainDatabase.db");

File l_PlayersFile = new File(l_DatabaseDir, "players.db");
l_PlayersFile.delete();

这里我从assets文件夹复制文件:

try
{
    InputStream inputStream = p_Context.getAssets().open("players.db");
    //Create the file before
    OutputStream outputStream = new FileOutputStream(l_PlayersFile);
    byte[] buffer = new byte[4096];
    int length;
    while ((length = inputStream.read(buffer)) > 0)
    {
        outputStream.write(buffer, 0, length);
    }
    outputStream.flush();
    outputStream.close();
    inputStream.close();
} catch (IOException e)
{
    e.printStackTrace();
}

最后我尝试获取数据库的当前版本:

m_PlayersDatabase = SQLiteDatabase.openDatabase(l_PlayersFile.toString(), null, SQLiteDatabase.OPEN_READWRITE);
int playersVersion = m_PlayersDatabase.getVersion();

android9 上的结果:db 版本与安装的第一个 apk 相同

android8 上的结果:db 版本是新 apk 中包含的文件之一

EDIT:经过进一步调查,问题似乎与 android 内存有关,因为只需更改数据库文件名(基本上是副本的目的地)

l_PlayersFile = new File(l_DatabaseDir, "newplayers.db");

使应用程序在 android 9 中也读取了正确的文件,所以看起来与旧文件名保持相同的文件名是导致问题的原因(即使删除和复制新文件文件已成功完成)。 所以资产文件夹更新没问题。 不过,该问题仅推迟到下一次更新,因为再次使用名称 "newplayers.db" 会导致完全相同的问题。 在每个开头生成一个随机名称就像绕圈一样非常残酷,有什么想法吗?

如我在编辑中所述解决:使用不同的名称(在我的例子中使用时间戳)从资产文件夹复制文件。

您可以更改资产文件夹的名称eg:dist->dist1,然后资产将被升级。