wis*_*lon 4 android xamarin akavache
我有一个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论坛.
我真的不想把所有的Akavache东西拉出来,因为我之前使用过它,在其他地方没有-Xamarin-Android,它真棒.否则我将不得不开始寻找某种xplat共享偏好管理器,我宁愿不这样做,因为Akavache应该做Just That.
编辑:这是一些代码:
初始化(我有一个静态共享的"AppGlobal"类,用于保存单例类型的东西)
public static class SharedAppGlobal
{
static SharedAppGlobal()
{
BlobCache.ApplicationName = SharedAppConstants.SharedAkavacheCacheName;
BlobCache.EnsureInitialized();
}
}
Run Code Online (Sandbox Code Playgroud)
一切正常,如果我在调试器中启动并查看 BlobCache它告诉我我正在使用Sqlite3存储及其路径(在非root用户的情况下我无法访问sqlite3 .db文件)设备)
我可以通过类似的方式调用缓存获取/设置
currentCookie = await BlobCache.LocalMachine.GetObject<Cookie>("authCookie");
然后用它们写回来
await BlobCache.LocalMachine.InsertObject("authCookie", cookie);
所有Akavache调用都在共享库中进行.我使用哪个商店(Secure,UserAccount或LocalMachine)并不重要,行为是一样的.
一切都很完美.然后我退出应用程序.重新打开应用程序(我可以重新启动手机以确保它已消失),并且缓存为空.或重置.或重新制作.我不知道是哪个,因为我看不到.db文件.
我不是在调试器下运行并且每次都重新部署.因此,部署目录不会被破坏.即使我安装了apk,也会发生这种情况.我认为它可能与那些不是它们所在的db文件有关,但我完全失去了.
我是否需要在特定于平台的级别实现某些功能并将其传递给共享库?我不这么认为,因为所有的依赖关系和路径似乎都得到了解决.
我浪费了几个小时.
谢谢 :)
好的,我找到了一个可以解决问题的解决方法.
我首先尝试重新解决问题,以便其他人可以看一看,当然它在新应用程序中完美运行.让我生气的颜色.
那么我尝试手动实例化一个SQlitePersistentBlobCache,给它一个特定的路径来创建我可以控制和看到使用的路径上的DB文件
GetExternalFilesDir(null).AbsolutePath + "test.db)
那工作!即使在重新启动之间,缓存仍然存在!
它仍然没有解释为什么我有原始问题,但现在这对我来说是一个可接受的解决方案.
我已经在https://github.com/wislon/xam-akavache-test上添加了一个关于github的解决方案.
该master分支使用标准的BlobCache静态实例.
该instantiate-blobcache分支使用的实例化SQlitePersistentBlobCache.
如果有人好奇,那就是.不幸的是,我不能花更多的时间来弄清楚为什么开箱即用的静态实例正在做它正在做的事情,因为我有一个产品要构建,但希望这有助于其他人.
| 归档时间: |
|
| 查看次数: |
3130 次 |
| 最近记录: |