Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/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
Xamarin.ios IOS上的Akavache损失信息_Xamarin.ios_Xamarin.forms_Akavache - Fatal编程技术网

Xamarin.ios IOS上的Akavache损失信息

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) {

我们在project中使用Akavache,在Android中一切都很好,但在iOS上我们遇到了一些问题,即如果我们在缓存中保存一个键值,如下所示:

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);
}
[参考: