【问题标题】:Assets folder not upgraded when installing new app安装新应用时资产文件夹未升级
【发布时间】:2019-08-13 11:24:00
【问题描述】:

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

问题是:我的应用程序似乎忽略了这个新文件,将旧文件保存在“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();

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

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

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

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

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

【问题讨论】:

  • 资产将在您安装应用程序时交付,而不是在您更新应用程序时交付。因此,请删除该应用并重新安装以交付资产
  • @juergend 谢谢,但不幸的是我不能这样做,否则我会丢失应用程序的其他数据。这在 android 9 之前有效,所以它看起来像是当时更新的资产。还有其他选择吗?
  • DB_FOLDER 被初始化为什么?发布价值
  • @GiddyNaya 用实际值编辑了问题

标签: android database android-studio apk assets


【解决方案1】:

正如我在编辑中所说的那样解决:从资产文件夹中复制具有不同名称的文件(在我的例子中是时间戳)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多