【问题标题】:how to update/insert/delete item in akavache list object?如何更新/插入/删除 akavache 列表对象中的项目?
【发布时间】:2017-01-30 11:01:14
【问题描述】:

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

   CacheItems= await BlobCache.LocalMachine.GetOrFetchObject<List<Item>>("CacheItems",
                  async () => await getdatafromAzure(recursive)); 

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

【问题讨论】:

  • 您是否测试了其他 Get Insert 和 Delete 方法? github.com/akavache/Akavache
  • @Depechie 也许我不明白插入的目的,但这会在 akavache 缓存中创建全新的对象,不是吗?等待 BlobCache.UserAccount.InsertObject("CacheItems", new item());这是否会在我的 CacheItems 中插入一个新项目插入,其类型为项目列表。
  • 我认为 GetOr*** 方法只是为您执行基本调用的重载。只要你使用相同的缓存键,我想你可以得到你需要的所有项目。
  • Akavache 基本上只是一个键/值存储类型的数据库,因此您不能像 SQL Lite 那样对存储在数据库中的记录进行部分更新。这确实是两种不同的存储概念。如果您只想更新一个字段,那么您可以将获取与插入链接起来,因此首先获取内容,然后更新字段,然后插入。在我的应用程序中,我只是使用 Akavache 进行持久性,所以我总是将模型保存在内存中,当我更新它们时,我会将它们推送到 Akavache,因此如果应用程序关闭,对象仍然会保留。您使用两者的用例是什么?似乎有些过分,但也许你有一个很好的案例
  • @ShaneNeuville 这听起来正是我想要的。我还是新手,我仍在尝试了解 akavache。你如何缓存对象?简单地使用静态对象还是可以使用 BlobCache.InMemory? BlobCache.InMemory 是否与 BlobCache.LocalMachine 相同,但会在内存中添加额外内容还是仅在内存中添加?

标签: xamarin.forms akavache


【解决方案1】:

保存到 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();

这真的都是非常无聊的东西:-p 只需获取一个对象并存储一个对象。在引擎盖下,Akavache 围绕那些无聊的东西做了很多非常酷的优化和同步,尽管它让我们其他人感到无聊

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

BlobCache.LocalMachine.InsertObject(someKEy, result).Subscribe()

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

我提供的示例更多的是完整的 Rx 访问方式...您在原始问题中的内容工作正常

        await BlobCache.LocalMachine.GetOrFetchObject<List<object>>("CacheItems",
              async () => await getdatafromAzure(recursive));

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

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

【讨论】:

  • 您是否必须真正检查它是否存在,或者当您插入时,如果不存在,它将已经处理插入,如果存在则更新现有值,或者复制值?顺便说一句,你为什么总是添加订阅后缀?有什么好的理由吗?
  • 基本上我只是实现了类似的逻辑,我使用静态列表在应用程序使用时保存在内存中,并且每次重新初始化应用程序时,我都会从 akavache 缓存中填充它。这就是为什么我对 InMemory 选项是否已经为我做了这种组合感到好奇。所以我不需要使用静态列表。我找不到有关的详细信息。
  • 不,您不必检查。那只是我演示获取和插入。你可以在得到之前插入。但通常使用 GET 时,您仍然需要捕获 KEYNotFoundException 以防万一。因此,如果您使用的是 TPL,那么您只需尝试获取即可。但是,如果您使用的是 GetOrFetchObject,那么它只会为您带来所有的魔力。请注意,我现在将永远存在于缓存中并且永远不会获取,除非您为其设置过期时间。
  • 我并没有真正使用过 InMemory。它可能会比您自己的列表提供更好的同步(这可能无关紧要)。 InMemory(我很确定)它序列化和反序列化您放入和取出的内容,因此您放入的对象与您检索的对象不同。而对于静态列表,它都是相同的参考。我只提到这一点是因为这在我正在做的应用程序中与我相关 :-) 也有人可能将它用于一致的数据访问模式,因为它们都实现了相同的接口。所以你可以在不同的场景中交换它们。
  • 关于插入和获取的更多说明。如果您尝试访问 Dictionary 中不存在的键,则使用 Dictionary 背后的模式基本上完全相同,您会遇到异常。但是您不必在更新关联值时检查密钥
猜你喜欢
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 2019-08-28
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多