Android上的Couchbase lite - 一般架构?

 jianyue1980_852 发布于 2022-12-20 19:40

我们正在使用couchbase构建一个项目.在Android上,我使用couchbase lite.通常,我一直在使用关系数据库,因为我是沙发基础新手,我无法找到"正确"的架构.我理解我认为的核心概念,但所有的示例和指南似乎都坚持某种简单的设置,他们在活动中访问数据库.

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

我在某种程度上完全忽略了这一点吗?我无法想象每个人都这样做吗?我每个人都在编写将文档单独转换为每个类的POJO模型类的方法吗?或者使用json解析器来做到这一点(但如果我不想加载外键那么这对外键不起作用,是吗?)?

很抱歉问题很多,但我觉得我错过了一些明显的问题.谢谢!

1 个回答
  • 会尝试回答你的问题:

    我在某种程度上完全忽略了这一点吗?

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

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

    我建议编写一个可以持久/检索POJO的通用Couchbase管理器类.然后,您可以在DAO中重复使用它.

    每个人都在编写方法,将文档分别转换为每个类的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所以它取决于你的代码有"外键"的概念.例如,Customer类可以具有帐户的ID:

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

    所以你可以看到你自己都在做这件事.我希望它是Couchbase的JPA或JDO实现/提供者(如DataNucleus或Hibernate)

    您应该从您的POJO/Document设计开始,尝试将您的POJO实体拆分为"数据块",以便在粗粒度与细粒度POJO之间取得适当的平衡.另请参阅关于密钥/文档设计注意事项的讨论.

    2022-12-20 19:42 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有