安装新应用时资产文件夹未升级
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,然后资产将被升级。
我有一个应用程序,在 "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,然后资产将被升级。