我有一个Xamarin Android项目,使用共享的PCL库,我决定使用Akavache作为临时数据存储(存储一些简单的登录状态信息,以便每次都保存重新启动)。
所以我将Akavache和Akavache.Sqlite3 nuget包添加到共享库(以及Xamarin.Android项目)。我设置了BlobCache.ApplicationName
,甚至称为EnsureInitialized
(这似乎不仅仅是记录消息)。
我将应用部署到了设备上。手动启动它(因此没有擦除数据和首选项等)。只要应用程序正在运行,就会缓存(并检索)数据。如果缺少键,它会抛出异常(如预期的那样)。一切都很完美。
然后我关闭了应用程序(在一个阶段我甚至重新启动了手机)。当我重新启动它时,缓存是空的,或重新初始化。无论哪种方式,我缓存的一切都消失了。
我在调试器中查看了存储缓存sqlite3文件的位置,该应用程序告诉我他们显然是data/data/packagename/cache/xyzblobs.db
。我看不到这些文件,因为它们位于内部系统缓存/应用程序文件目录中,所以我不知道它们是否会被擦除。
我已经开启了WRITE_EXTERNAL_STORAGE(和READ_)权限。没有骰子。我尝试过使用Secure
,UserAccount
和LocalMachine
个目标。纳达。他们都没有工作。
只要应用程序正在运行(或在内存中),它就会按预期运行。应用消失的那一刻,缓存也是如此。
我唯一没做过的就是调用BlobStorage.Shutdown()
方法。那是因为我不知道在哪里调用它。我有多项活动,并且不想因为愚蠢而被引用计数。
编辑:稍后我强行打电话给.Shutdown().Wait()
并且似乎没有任何帮助。
还有其他人经历过这个吗?我知道至少有一个人遇到了完全相同的问题,详见Xamarin forums。
我真的不想把所有的Akavache东西拿出来,因为我之前已经使用过它,在其他地方没有使用Xamarin-Android,而且非常棒。否则,我将不得不开始寻找某种xplat共享首选项管理器,我不愿意这样做,因为Akavache应该做Just That。
编辑:这里有一些代码:
初始化(我有一个静态共享" AppGlobal"我用它来保存单例类型的东西)
public static class SharedAppGlobal
{
static SharedAppGlobal()
{
BlobCache.ApplicationName = SharedAppConstants.SharedAkavacheCacheName;
BlobCache.EnsureInitialized();
}
}
一切正常,如果我在调试器中启动并查看BlobCache
它告诉我我使用的是Sqlite3存储及其路径(sqlite3 .db文件)在非root设备上我无法访问
我可以使用
之类的东西调用缓存获取/设置 currentCookie = await BlobCache.LocalMachine.GetObject<Cookie>("authCookie");
并用
await BlobCache.LocalMachine.InsertObject("authCookie", cookie);
所有Akavache调用都在共享库中进行。我使用哪个商店(Secure,UserAccount或LocalMachine)并不重要,行为是一样的。
一切都很完美。然后我退出应用程序。重新打开应用程序(我可以重新启动手机以确保它已消失),并且缓存为空。或重置。或重新制作。我不知道哪个是因为我看不到.db文件。
我不是在调试器下运行并且每次都重新部署。因此,部署目录不会被破坏。即使我安装了apk,也会发生这种情况。我认为它可能与那些不是它们所在的db文件有关,但我完全失去了。
我是否需要在特定于平台的级别实现某些功能并将其传递给共享库?我不这么认为,因为所有的依赖关系和路径似乎都得到了解决。
我浪费了很多时间。
谢谢:)
答案 0 :(得分:5)
好的,我找到了一个可以解决问题的解决方法。
我首先尝试重新解决问题,以便其他人可以看看,当然它在新应用中完美运行。让我生气。
然后我尝试手动实例化SQlitePersistentBlobCache
,给它一条特定的路径,在我可以控制的路径上创建数据库文件并使用
GetExternalFilesDir(null).AbsolutePath + "test.db)
这很有效!即使在重新启动之间,缓存仍然存在!
它仍然没有解释为什么我有原始问题,但现在这对我来说是一个可以接受的解决方案。
我在https://github.com/wislon/xam-akavache-test的github上添加了一个解决方案。
master
分支使用标准BlobCache
静态实例。
instantiate-blobcache
分支使用实例化的SQlitePersistentBlobCache
。
如果有人好奇,那就是。不幸的是,我不能花更多的时间来弄清楚为什么开箱即用的静态实例正在做它正在做的事情,因为我有一个可以构建的产品,但希望这有助于其他人。 / p>
答案 1 :(得分:4)
我遇到了同样的问题,我解决了它在设置中检查在部署之间保留设备上的应用程序数据/缓存。
在Visual Studio中:
在Xamarin Studio中:
或
希望它有所帮助!
答案 2 :(得分:0)
对于Xamarin Forms应用程序,这对我有用:
覆盖OnStart
protected override void OnStart() { //应用程序启动时处理 BlobCache.ApplicationName =&#34; AppName&#34 ;; BlobCache.EnsureInitialized(); }
在mainagioia上应用上面的建议(我想对mainagioia的建议添加投票,但似乎我的声誉太低了......这就是为什么我要添加这一点)。 在设置中部署之间保留设备上的应用程序数据/缓存