Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Akavache未在应用程序重启之间持久化缓存数据_Android_Xamarin_Akavache - Fatal编程技术网

Android Akavache未在应用程序重启之间持久化缓存数据

Android Akavache未在应用程序重启之间持久化缓存数据,android,xamarin,akavache,Android,Xamarin,Akavache,我有一个Xamarin Android项目,使用一个共享PCL库,我决定使用Akavache作为临时数据存储(存储一些简单的登录状态信息,避免每次重新登录) 因此,我将Akavache和Akavache.Sqlite3 nuget包添加到共享库(以及Xamarin.Android项目)。我设置了BlobCache.ApplicationName,甚至调用了EnsureInitialized(这似乎只不过是记录一条消息) 我将应用程序部署到设备上。手动启动它(因此不需要擦除数据和首选项等)。只要应

我有一个Xamarin Android项目,使用一个共享PCL库,我决定使用Akavache作为临时数据存储(存储一些简单的登录状态信息,避免每次重新登录)

因此,我将Akavache和Akavache.Sqlite3 nuget包添加到共享库(以及Xamarin.Android项目)。我设置了
BlobCache.ApplicationName
,甚至调用了
EnsureInitialized
(这似乎只不过是记录一条消息)

我将应用程序部署到设备上。手动启动它(因此不需要擦除数据和首选项等)。只要应用程序运行,数据就会被缓存(和检索)。如果缺少键,它会抛出异常(如预期的那样)。一切都很完美

然后我关闭了应用程序(在某个阶段我甚至重新启动了手机)。当我重新启动它时,缓存要么为空,要么重新初始化。不管怎样,我缓存的所有东西都不见了

我在调试器中查看了缓存sqlite3文件的存储位置,应用程序告诉我它们显然位于
data/data/packagename/cache/xyzblobs.db
。我看不到这些文件,因为它们位于内部系统缓存/应用程序文件目录中,所以我不知道它们是否正在被擦除

我已打开“写入”外部存储(和“读取”)权限。没有骰子。我尝试过使用
Secure
UserAccount
LocalMachine
目标。娜达。它们都不起作用

只要应用程序正在运行(或在内存中),它就会按预期运行。应用程序离开的那一刻,缓存也离开了

我唯一没有做的就是调用
BlobStorage.Shutdown()
方法。那是因为我不知道该怎么称呼它。我有多个活动,不想被引用计数,因为我很愚蠢

编辑:后来我强制调用了
.Shutdown().Wait()
,这似乎也没有什么帮助

还有其他人经历过吗?我知道至少还有一个人有着完全相同的问题,详细内容请参见

我真的不想把所有阿卡瓦什的东西都拿出来,因为我以前在其他地方用过它,而不是在Xamarin Android上,它太棒了。否则,我将不得不开始研究某种xplat共享首选项管理器,我不希望这样做,因为Akavache应该这样做

编辑:以下是一些代码:

初始化(我有一个静态共享的“AppGlobal”类,用来保存单例类型的东西)

如果我在调试器中启动它并查看
BlobCache
,它会告诉我正在使用Sqlite3存储及其路径(尽管Sqlite3.db文件在非根设备上无法访问)

我可以调用缓存get/set,比如

currentCookie=await BlobCache.LocalMachine.GetObject(“authCookie”);
并用

wait-BlobCache.LocalMachine.InsertObject(“authCookie”,cookie);

所有Akavache调用都在共享库中进行。无论我使用哪个存储(安全、用户帐户或本地计算机),行为都是一样的

一切都很完美。然后我退出应用程序。重新打开应用程序(我可以重新启动手机,以确保它已离开),缓存为空。或者重置。或者重新制作。我不知道是哪个,因为我看不到.db文件

我不是每次都在调试器下运行和重新部署。因此,部署目录不会被破坏。即使在安装apk时也会发生这种情况。我认为这可能与那些数据库文件不在它所说的位置有关,但我完全不知所措

我是否需要在特定于平台的级别实现某些东西并将其传递给共享库?我不这么认为,因为所有的依赖关系和路径似乎都得到了解决

我在这上面浪费了好几个小时


谢谢:)

好的,我找到了一个解决问题的方法

我首先尝试重新设置问题,以便其他人可以查看,当然在新的应用程序中它工作得非常好。我很生气

因此,我尝试手动实例化一个
SQlitePersistentBlobCache
,为它提供一个特定的路径,以便在我可以控制和查看的路径上创建DB文件

GetExternalFilesDir(null).AbsolutePath+“test.db)

这就成功了!缓存仍然存在,即使是在重启之间

它仍然不能解释我为什么会有最初的问题,但现在这对我来说是一个可以接受的解决方案

我在github上添加了一个解决方案

master
分支使用标准的
BlobCache
静态实例

实例化blobcache
分支使用实例化的
SQlitePersistentBlobCache


如果有人好奇的话,就是这样。不幸的是,我不能花更多的时间来弄清楚为什么开箱即用的静态实例正在做它正在做的事情,因为我有一个产品要构建,但希望这能帮助其他人。

我也有同样的问题,我在部署之间通过检查在设备上保留应用程序数据/缓存来解决它在设置中

在Visual Studio中:

  • 工具>选项>(左侧树)Xamarin>Android设置>选中“在部署之间在设备上保留应用程序数据/缓存”
在Xamarin工作室:

  • (Windows)工具>选项>项目>Android>选中在应用程序部署之间保留数据/缓存

  • (OS X)Xamarin Studio>首选项>项目>Android>选中“在应用程序部署之间保留数据/缓存”

希望能有所帮助!

对于Xamarin表单应用程序,这对我来说很有用:

  • 在PCL、iOS和Android项目中安装SqlLite3
  • 在PCL、iOS和Android项目中安装Akavache
  • 覆盖启动

    受保护的覆盖void OnStart() {
    public static class SharedAppGlobal
    {
      static SharedAppGlobal()
      {
        BlobCache.ApplicationName = SharedAppConstants.SharedAkavacheCacheName;
        BlobCache.EnsureInitialized();
      }
    }