- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想备份我的内部文件。这些是由我的应用程序创建的:随机数量的文件和随机名称。比如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 函数的代码
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/
如何将多个json对象添加/映射到dart对象 import 'dart:async'; import 'dart:convert'; import 'package:flutter/foundati
我正在研究将产品集成到 Dynamics Great Plains 中。我之前使用过 Dynamics CRM,但没有使用过 Great Plains。我听说 GP 与 CRM 是不同的动物,即使它们
System.Linq.Dynamic.Core 和 System.Linq.Dynamic 有什么区别?我目前正在使用 System.Linq.Dynamic 并且它不包含对 的支持选择 和 多选
我正在尝试通过Firebase存储将图像上传到Firebase,然后在Firestore中创建一个文档,其中包含上述上传图像的网址。为此,我使用此功能 void uploadImageAndCr
我一直在尝试整理一些东西,使我可以从 ListPlot 中提取点,以便在进一步的计算中使用它们。我目前的方法是使用 Locator[] 选择点。这适用于显示点,但我无法弄清楚如何从带有 head Dy
只要我在与 Program 类相同的程序集中有类 ClassSameAssembly ,下面的代码就可以正常工作。但是,当我将类 ClassSameAssembly 移动到单独的程序集时,会引发 Ru
我只是尝试从Firebase实时数据库解析数据。 但在转换为模型时有问题 我正在尝试从Flutter上解析Firebase数据库中的数据。 但是一个错误说 MY Complete QUIZ: {-M5
我创建了一个方法,当我构建它时,出现了这个错误: type '_InternalLinkedHashMap' is not a subtype of type 'List' in type cast
我对这个 flutter 的简单图表代码有疑问。在我尝试运行代码时显示此错误。请任何人都可以帮助我在这.... The argument type 'List>' can't be assigned
我尝试在我的 flutter 应用程序中解析来自 Firestore 的文档。 Firestore 文档: 我创建了两个类来解析这个文档。 类产品: class Produkt{ String n
我有一个2d-List,其中包含一个字符串和一个Map,如下所示: List> content = [ [ "String", { "one": 23,
我使用 Dart“json_serializable”包在 Flutter 应用程序中的 Firestore 数据结构下反序列化。 { googleBookId: jjl4BgAAQBAJ, prov
我注册了 Dynamic CRM 在线试用版(30 天)并创建了一个非托管自定义解决方案(新字段、一些自定义实体等)。现在,我想导出非托管解决方案并将其导入到我的服务器中的 Dynamic CRM O
当我尝试从 StreamTransform 获取一些数据时遇到一些问题 我不明白什么是正确的数据类型 未捕获的异常:类型错误:“_StreamHandlerTransformer”的实例:“_Stre
我正在尝试获取用户数据,但在这样做时出现以下错误: Exception: type '_InternalLinkedHashMap' is not a subtype of type 'Map 我查看
我正在尝试在 sqflite 数据库中保存一些带有 flutter 的数据,但我仍然收到一条错误消息: [ERROR:flutter/shell/common/shell.cc(181)] Dart
我有一个JSON响应,结构如下:。在这个JSON响应中,有各种动态键,如“Owner”和“Master”,每个键都包含一个JSON对象或一个JSON对象数组。我需要创建一个gson数据类来解析这个动态
在 Dynamics 2012 ax 中编译 CIL 时,我看到以下错误 - 名称为“Dynamics.Ax.application”的重复类型。在程序集中“Dynamics.Ax.applicati
我有一个带有 LinkedHashMap 成员的 StatefulWidget 小部件,如下所示: LinkedHashMap _items = new LinkedHashMap>(); 现在我需要
我正在尝试按照此处所述实现搜索资源功能:https://cloudblogs.microsoft.com/dynamics365/it/2019/05/21/retrieve-resource-ava
我是一名优秀的程序员,十分优秀!