【发布时间】: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