如何更新/插入/删除 akavache 列表对象中的项目?

bat*_*aci 1 xamarin.forms akavache

我应该使用 akavache 作为我的 xamarin 表单应用程序中的主要本地数据库还是另一个 sqlite 数据库之上的缓存数据库?因为我找不到任何关于如何在 akavache 对象中更新、插入、删除数据的示例。例如,

   CacheItems= await BlobCache.LocalMachine.GetOrFetchObject<List<Item>>("CacheItems",
                  async () => await getdatafromAzure(recursive)); 
Run Code Online (Sandbox Code Playgroud)

我从 azure 获取项目并存储在本地机器中,这些项目是可编辑/可删除的,或者用户可以添加新项目。我该怎么做?

Sha*_*lle 5

保存到 LocalMachine 的任何内容都会物理持久化到设备中。因此,在应用程序或设备重启时,它仍然存在(如果用户尚未删除应用程序或清除数据)

至于如何访问/保存这里有很多很好的示例 https://github.com/akavache/Akavache

Insert Object 和 Get Object 是你的基本访问方法,然后还有很多扩展方法,比如 GetOrFetch、GetAndFetch,非常有用

这是我没有经过超级测试的快速示例,以提供一种访问内容的方法。使用一些扩展方法可能会更好,但我认为这样的例子在概念上很有用。

BlobCache.LocalMachine.GetObject<Tobject>(someKEy)
            .Catch((KeyNotFoundException ke) => Observable.Return<Tobject>(null))
            .SelectMany(result =>
            {
                //object doesn't exist in cache so create a new one
                if (result == null)
                    result = new Tobject();

                //apply whatever updates you are wanting to do
                //result.SomeField = "bob";

                //This will replace or insert data
                return BlobCache.LocalMachine.InsertObject(someKEy, result);

            })
            .Subscribe();
Run Code Online (Sandbox Code Playgroud)

这真的是很无聊的东西:-p 只是获取一个对象并存储一个对象。在幕后,Akavache 围绕这些无聊的东西做了很多非常酷的优化和同步,尽管让我们其他人觉得无聊

在大多数情况下,当我启动 VM 时,我会从缓存中检索对象,然后将其存储为 VM 上或某个服务类中的某个属性。然后当对对象进行任何更改时,我只需将其插入缓存中

BlobCache.LocalMachine.InsertObject(someKEy, result).Subscribe()
Run Code Online (Sandbox Code Playgroud)

那时我知道如果应用程序关闭我将在用户启动应用程序时拥有该对象的最新版本

我给出的例子更像是完整的 Rx 访问方式......你在你原来的问题中所拥有的工作正常

        await BlobCache.LocalMachine.GetOrFetchObject<List<object>>("CacheItems",
              async () => await getdatafromAzure(recursive));
Run Code Online (Sandbox Code Playgroud)

如果缓存不存在,那基本上会检查缓存,然后它会转到 Azure ...

LocalMachine 存储到物理设备,InMemory 只存储到一些内部字典,一旦应用程序从内存中卸载,该字典就会消失,而 UserAccount 与 NT 远程帐户一起使用。

  • 不,您不必检查。那只是我演示获取和插入。你可以在得到之前插入。但通常使用 GET 时,您仍然希望捕获 KEYNotFoundException 以防万一。因此,如果您使用的是 TPL,那么您只需尝试捕获 get。如果您正在使用 GetOrFetchObject,那么它只是为您完成所有魔术。请注意,我现在将始终存在于缓存中并且永远不会获取,除非您对其设置过期时间。 (2认同)