【问题标题】:Couchbase lite on Android - General architecture?Android 上的 Couchbase lite - 通用架构?
【发布时间】:2016-11-17 01:35:10
【问题描述】:

我们正在使用 couchbase 构建一个项目。在 Android 上,我使用 couchbase lite。通常,我一直在使用关系数据库,因为我是 couchbase 的新手,所以我很难找到“正确”的架构。我确实理解我认为的核心概念,但所有示例和指南似乎都坚持某种简单的设置,它们可以直接在活动中访问数据库。

我更习惯于有一些数据库抽象,其中业务逻辑只能查看通过数据库接口或某些 DAO 或其他东西传递的 POJO DTO。所以我现在已经注释了我的模型类并开始编写一个简单的 OR 映射器,但是使用不同类型的数据、外键等。这非常耗时。

我是否完全错过了这里的重点?我无法想象每个人都这样做?我每个人都为每个类分别编写将文档转换为 POJO 模型类的方法吗?或者使用 json 解析器来做到这一点(但如果我不想加载外键,这对外键不起作用,是吗)?

很抱歉问题太多,但我觉得我在这里遗漏了一些明显的东西。谢谢!

【问题讨论】:

    标签: android database architecture couchbase


    【解决方案1】:

    将尝试回答您的问题:

    我是否完全错过了这里的重点?

    没有。您可以将 noSQL CB 视为持久分布式对象缓存。所以它不是RDBMS。但是,DAO 模式非常适合这个模型……因为您要在 DAO 级别和 noSQL 级别处理 DTO/ValueObjects/POJO。

    我无法想象每个人都这样做?

    我建议编写一个可以持久化/检索 POJO 的通用 Couchbase 管理器类。然后你可以在你的 DAO 中重新使用它。

    每个人都在编写将 Documents 转换为 POJO 模型类的方法 分别为每个班级?或者使用 json 解析器来做到这一点(但是 如果我不想加载外键,它就不能工作,是吗?

    您可以在您的 Couchbase 管理器类中使用一个通用代码来执行从/到 json 到 POJO 的转换。因此,您只使用 POJO,并且在您的应用程序代码中看不到任何 json(在 Couchbase 管理器类之外) 这是此类的一个示例:

    public class CouchbaseManager<K, V>
    {
      private final Class<V> valueTypeParameterClass;
    
      @Inject
      private CouchbaseClient cbClient;
    
      @Inject
      private Gson gson;
    
      public CouchbaseManager(final Class<V> valueClass)
      {
        this.valueTypeParameterClass = valueClass;
      }
    
      public V get(K key)
      {
        V res = null;
        String jsonValue = null;
        if (key != null)
        {
          jsonValue = (String) cbClient.get(key);
          if (jsonValue != null)
          {
            res = gson.fromJson(jsonValue, valueTypeParameterClass);
          }
        }
        return res;
      }
    
      public void put(K key, V value)
      {
        int ttl = 0;
        cbClient.set(key, ttl, gson.toJson(value, valueTypeParameterClass));
      }
    }
    

    然后在您的 DAO 代码中为每种类型创建 CouchbaseManager 实例:

    CouchbaseManager<String,Customer> cbmCustomer = new CouchbaseManager<String,Customer>(Customer.class);
    
    CouchbaseManager<String,Account> cbmAccount = new CouchbaseManager<String,Account>(Account.class);
    
    // and so on for other POJOs you have.
    // then get/put operations look simple
    Customer cust = cbmCustomer.get("cust-1234");
    cust.setName("New Name"); // mutate value
    // store changes
    cbmCustomer.put(cust.getId(), cust);
    

    现在关于“外键”。请记住,它不是 RDBMS,因此取决于您的代码是否具有“外键”的概念。例如,客户类可以有一个帐户的 id:

    Customer cust = cbmCustomer.get("cust-1234");
    String accId = cust.getAccountId();
    //You can load account
    Account acc = cbmAccount.get(accId);
    

    如您所见,这一切都是您自己做的。我希望它是 JPAJDO Couchbase 的实现/提供者(如 DataNucleusHibernate

    您应该真正从您的 POJO/文档设计开始,尝试将您的 POJO 实体拆分为数据“块”,以在粗粒度和细粒度 POJO 之间取得适当的平衡。 另见this discussion on key/document design considerations

    【讨论】:

    • 感谢您的洞察!我今天在工作中得出了同样的结论,并最终编写了自己的 OR 映射器。为了保持通用性并支持文档之间的关系,我现在使用注释并通过反射检查它们。到目前为止,这种方法似乎按预期工作。我仍然有点困惑,但是我必须这样做,因为我想大多数项目都需要某种形式的类似的东西。总之,谢谢!
    • @metter 您是否找到任何其他将 POJO 与 Couchbase Lite 一起使用的选项?如果您决定继续使用自己的通用实现,您是否打算开源它?我对您提到的支持关系的基于注释的方法特别感兴趣。
    • @ashughes 是的,我最终还是使用了自己的。但是,它绝不会处于允许我开源它的状态,我现在正在从事另一个项目。
    • 请原谅我的无知,但是 CacheMan 是什么?
    • @1vand1ng0 好收获!您应该将其阅读为 cbClient。我还更新了我的代码示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多