Xamarin.ios IOS上的Akavache损失信息
我们在project中使用Akavache,在Android中一切都很好,但在iOS上我们遇到了一些问题,即如果我们在缓存中保存一个键值,如下所示:Xamarin.ios IOS上的Akavache损失信息,xamarin.ios,xamarin.forms,akavache,Xamarin.ios,Xamarin.forms,Akavache,我们在project中使用Akavache,在Android中一切都很好,但在iOS上我们遇到了一些问题,即如果我们在缓存中保存一个键值,如下所示: public async void Salvar(Login login) { await BlobCache.LocalMachine.InsertObject("login", login); } public async Task<bool> Salvar(Login login) {
public async void Salvar(Login login)
{
await BlobCache.LocalMachine.InsertObject("login", login);
}
public async Task<bool> Salvar(Login login)
{
try
{
await CacheConfig.NormalCache.InsertObject("login", login);
}
catch (Exception ex)
{
//todo
}
return true;
}
如果我停止调试会话,再次启动调试并尝试使用以下方法获取值,BlobCache将无错误地保存:
public async Task<Login> Recuperar()
{
try
{
var dados = await BlobCache.LocalMachine.GetObject<Login>("login");
return dados;
}
catch (KeyNotFoundException)
{
return null;
}
}
at OnStar方法
有人知道发生了什么吗?感谢< P>我猜测,因为你在中间停止进程“如果我停止调试会话”,你就不会关闭缓存,然后丢失一些数据。
看看这里:
< P>我猜,既然你在中间停止进程,“如果我停止调试会话”,你就不会关闭缓存,然后丢失一些数据。看看这里:只是猜测,但可能您的
Salvar
方法正在抛出(可能login
无法序列化)?你不会真正知道这是因为你没有等待它。您不能这样做,因为它返回的是void
而不是Task
。这是一种不好的做法,应该尽可能避免
更改
Salvar
以返回Task
,并确保等待保存。只是猜测,但可能您的Salvar
方法正在抛出(可能login
无法序列化)?你不会真正知道这是因为你没有等待它。您不能这样做,因为它返回的是void
而不是Task
。这是一种不好的做法,应该尽可能避免
更改Salvar
以返回任务
,并确保等待
保存。最终解决!问题是阿卡瓦什正在使用的路径,在创建了我自己的路径之后,问题就解决了
1-创建一个DependencyService,以获取运行时平台路径,如iOS:
var documentsPath =Environment.GetFolderPath(Environment.SpecialFolder.Personal);
var libraryPath = Path.Combine(documentsPath, "..", "Library");
var path = Path.Combine(libraryPath, "cache.db");
在PCL初始化中,您可以执行以下操作:
BlobCache.ApplicationName = "AppName";
BlobCache.EnsureInitialized();
var local = DependencyService.Get<ILocalCache>();
var pathToCacheDbFile = local.GetPath();
CacheConfig.NormalCache = new SQLitePersistentBlobCache(pathToCacheDbFile);
然后使用所有缓存,如下所示:
public async void Salvar(Login login)
{
await BlobCache.LocalMachine.InsertObject("login", login);
}
public async Task<bool> Salvar(Login login)
{
try
{
await CacheConfig.NormalCache.InsertObject("login", login);
}
catch (Exception ex)
{
//todo
}
return true;
}
公共异步任务Salvar(登录)
{
尝试
{
等待CacheConfig.NormalCache.InsertObject(“login”,login);
}
捕获(例外情况除外)
{
//待办事项
}
返回true;
}
此解决方案基于此处的其他线程
问候终于解决了!问题是阿卡瓦什正在使用的路径,在创建了我自己的路径之后,问题就解决了
1-创建一个DependencyService,以获取运行时平台路径,如iOS:
var documentsPath =Environment.GetFolderPath(Environment.SpecialFolder.Personal);
var libraryPath = Path.Combine(documentsPath, "..", "Library");
var path = Path.Combine(libraryPath, "cache.db");
在PCL初始化中,您可以执行以下操作:
BlobCache.ApplicationName = "AppName";
BlobCache.EnsureInitialized();
var local = DependencyService.Get<ILocalCache>();
var pathToCacheDbFile = local.GetPath();
CacheConfig.NormalCache = new SQLitePersistentBlobCache(pathToCacheDbFile);
然后使用所有缓存,如下所示:
public async void Salvar(Login login)
{
await BlobCache.LocalMachine.InsertObject("login", login);
}
public async Task<bool> Salvar(Login login)
{
try
{
await CacheConfig.NormalCache.InsertObject("login", login);
}
catch (Exception ex)
{
//todo
}
return true;
}
公共异步任务Salvar(登录)
{
尝试
{
等待CacheConfig.NormalCache.InsertObject(“login”,login);
}
捕获(例外情况除外)
{
//待办事项
}
返回true;
}
此解决方案基于此处的其他线程
关于我最近遇到了这个问题,对我来说,这是因为我丢失了这个文件
如果其他人遇到这个问题,我首先建议大家像OP一样,创建自己的。最终这会更好,但是如果您想使用静态类,那么请确保有一个
使用系统;
使用Akavache.Sqlite3;
//注意:该类文件是iOS正常工作所必需的,并且
//如果启用“链接所有程序集”,这也是Android的一个好主意。
名称空间名称空间
{
[保存]
公共静态类LinkerReserve
{
静态LinkerReserve()
{
抛出新异常(typeof(SQLitePersistentBlobCache.FullName);
}
}
公共类属性:属性
{
}
}
现在的情况是,弹性缓存从未被交换,它只是默认使用InMemory缓存。这就是重新启动时数据消失的原因我最近遇到了这个问题,对我来说,这是因为我丢失了这个文件
如果其他人遇到这个问题,我首先建议大家像OP一样,创建自己的。最终这会更好,但是如果您想使用静态类,那么请确保有一个
使用系统;
使用Akavache.Sqlite3;
//注意:该类文件是iOS正常工作所必需的,并且
//如果启用“链接所有程序集”,这也是Android的一个好主意。
名称空间名称空间
{
[保存]
公共静态类LinkerReserve
{
静态LinkerReserve()
{
抛出新异常(typeof(SQLitePersistentBlobCache.FullName);
}
}
公共类属性:属性
{
}
}
现在的情况是,弹性缓存从未被交换,它只是默认使用InMemory缓存。这就是重新启动时数据消失的原因您的问题是使用了“本地机器”
Xamarin.iOS可能会删除BlobCache.LocalMachine中存储的数据以释放磁盘空间(仅当应用程序未运行时)。BlobCache.UserAccount和BlobCache.Secure的位置将备份到iCloud和iTunes
Xamarin.Android如果系统磁盘空间不足,也可能开始删除存储在BlobCache.LocalMachine中的数据。在系统清理时,没有明确指定你的应用程序是否可以运行
有四个内置位置在某些系统上应用了一些魔法:
BlobCache.LocalMachine-缓存数据。此数据可能会在不通知的情况下被删除
BlobCache.UserAccount-用户设置。一些系统将这些数据备份到云中
BlobCache.Secure-用于保存敏感数据,如凭据
BlobCache.InMemory一个数据库,保存在内存中。数据将在应用程序的生命周期内存储
你应该使用
public async void Salvar(Login login)
{
await BlobCache.UserAccount.InsertObject("login", login);
}
[参考: