gpt4 book ai didi

安卓数据备份: dynamic file list with BackupAgentHelper

转载 作者:太空狗 更新时间:2023-10-29 12:43:07 27 4
gpt4 key购买 nike

我想备份我的内部文件。这些是由我的应用程序创建的:随机数量的文件和随机名称。比如data1.xml, data7,xml, data13.xml, ....

所以我没有任何固定的文件列表。

当 MyBackupAgentHelper::onCreate 在 onBackup() 之前运行时,我可以通过查询文件 getApplicationContext().fileList(); 轻松提供文件名;

public class MyBackupAgentHelper extends BackupAgentHelper 
{
@Override
public void onCreate()
{
String[] files = getApplicationContext().fileList();
FileBackupHelper helper = new FileBackupHelper(this, files );
addHelper(FILES_BACKUP_KEY, helper);
}
...

但是,如果 onRestore 准备好在卸载/重新安装后运行,我无法在 onCreate 中提供文件名,因为这次 getApplicationContext().fileList() 返回空列表 - 显然。

所以什么都没有恢复 :(

有什么方法可以在不指定文件名的情况下恢复所有备份的文件吗?只是说,“全力以赴”。

如果没有,我该如何在这种情况下使用数据备份?

谢谢

最佳答案

我刚遇到同样的问题。这令人沮丧,因为 FileBackupHelper 几乎完全按照我们的意愿去做。

如果您在这里查看 FileBackupHelper 的 restoreEntity 函数的代码

https://android.googlesource.com/platform/frameworks/base.git/+/android-4.2.2_r1/core/java/android/app/backup/FileBackupHelper.java

public void restoreEntity(BackupDataInputStream data) {
if (DEBUG) Log.d(TAG, "got entity '" + data.getKey() + "' size=" + data.size());
String key = data.getKey();
if (isKeyInList(key, mFiles)) {
File f = new File(mFilesDir, key);
writeFile(f, data);
}
}

...您可以看到文件未被写入的唯一原因是它们不在您传递给 FileBackupHelper 构造函数的列表中。

我的第一个解决方案是覆盖 isKeyInList 以始终返回 true。这确实有效,但后来我觉得很奇怪,因为 isKeyInList 具有默认保护,而我的 FileBackupHelper 子类不在同一个包中。事实证明这是某种允许这样做的 dalvik vm 错误,所以我不想依赖它(参见 Android method with default (package) visibility overriding (shouldn't work, but does - why?))

但后来我意识到我可以保留传递给 FileBackupHelper 构造函数的文件数组,然后将第一个元素更改为始终是要创建的文件的名称。这样它就总能在列表中找到。

class MyFileBackupHelper extends FileBackupHelper
{
String[] mMyFiles;
MyFileBackupHelper(Context context, String... files)
{
super(context,files);
mMyFiles = files;
}

/* boolean isKeyInList(String key, String[] list)
{
return true;
} */

public void restoreEntity(BackupDataInputStream data)
{
mMyFiles[0] = data.getKey();
super.restoreEntity(data);
}
}

当然,这也依赖于 FileBackupHelper 在不复制文件列表的情况下保持相同的实现。我不太清楚他们为什么要费那么大劲来防止恢复任意文件,也许他们以后会试图阻止这个解决方案。但就目前而言,我称之为好!

哦,是的,使我的解决方案起作用的一个额外细节是,您需要确保在恢复时列表中始终有一个文件。这样总会有一个数组元素 0 可以替换。这就是我在 BackupAgent 中所做的

public class MyBackupAgent extends BackupAgentHelper 
{
public void AddFileHelper(String files[])
{
FileBackupHelper aHelper = new MyFileBackupHelper(this,files);
addHelper("userfiles", aHelper);
}

@Override
public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException
{
String[] anArray = GetAllUserFiles(); // I'm not including this function for brevity
AddFileHelper(anArray);
super.onBackup(oldState, data, newState);
}

@Override
public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState) throws IOException
{
AddFileHelper(new String[] { "filename" } );
super.onRestore(data, appVersionCode, newState);
}
}

所以你看到我不依赖 onCreate()。相反,我将正确的文件放在 onBackup 的列表中,我只将一个文件名放在 onRestore 的列表中。然后 MyFileBackupHelper 每次在调用父 restoreEntity 之前替换该列表中的数组元素 0。希望谷歌会让这个解决方案在他们的库的 future 版本中继续工作,因为它看起来是一个不错的功能!

关于安卓数据备份: dynamic file list with BackupAgentHelper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22390892/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com