• VUE 使用Rxdb存储浏览器数据库


    VUE - 使用Rxdb存储浏览器数据库

    Rxdb官网:https://rxdb.info/

    开发环境:vue2,vuecli4

    安装插件:

    安装:pouchdb-adapter-idb

    如使用 npm 则安装 rxdb,如使用yarn 则使用rxjs。

    npm install rxdb --save-dev
    yarn add rxjs --save-dev

     在src文件下创建 rxdb-pack 文件夹

    创建如下结构

     

     schemas.js ,创建 demo 文件schema

    //node
    const schemaDemo = {
      version: 0,
      primaryKey: 'id',
      type: 'object',
      properties: {
        id: {
          type: 'string'
        },
        name: {
          type: 'string'
        },
        updatedAt: {
          type: 'number'
        },
        "_deleted": {
          type: 'boolean',
          default: false
        },
      },
      required: ['id']
    };
     
    export {
      schemaDemo
    }

     index.js

    import {
      createRxDatabase,
      removeRxDatabase
    } from 'rxdb';
    
    // because we use the PouchDB RxStorage, we have to add the indexeddb adapter first.
    import {
      getRxStoragePouch,
      addPouchPlugin
    } from 'rxdb/plugins/pouchdb';
    addPouchPlugin(require('pouchdb-adapter-idb'));
    
    import {
      schemaDemo
    } from './schemas';
    
    
    let Database = {};
    let dbConfig = {
      name: 'heroesdb',
      storage: getRxStoragePouch('idb')
    }
    
    //创建
    let createPromise = null;
    const create = async () => {
      const database = await createRxDatabase({
        name: dbConfig.name, // <- name
        storage: dbConfig.storage, // <- RxStorage
        password: '%kD8n^%nR3GP9ouc', // <- password (optional)
        multiInstance: true, // <- multiInstance (optional, default: true)
        eventReduce: true // <- eventReduce (optional, default: true)
      });
    
      //创建表
      await database.addCollections({
        demo: {
          schema: schemaDemo
        }
      });
    
      return database;
    };
    
    // Database.remove = async () => {
    //   await removeRxDatabase(dbConfig.name, dbConfig.storage);
    // };
    
    //获取
    Database.get = async () => {
      if (!createPromise) {
        createPromise = await create();
      }
      return createPromise;
    };
    
    export default Database;

    sence.js

    import OpeBase from "./base";
    import Database from '../index';
    
    class OpsSence extends OpeBase {
      constructor(_myColl) {
        super(_myColl);
        this.myColl = _myColl;
      }
    
      static async build() {
        let mydb = await Database.get();
        let _myColl = mydb.demo;
        return new OpsSence(_myColl);
      }
    }
    
    export default OpsSence;

     base.js

    class OpeBase {
    
      constructor(_myColl) { this.myColl = _myColl; 
      }
    
      //批量增加
      bulkInsert = async (arr) => await this.myColl.bulkInsert(arr);
    
      //新增/修改
      atomicUpsert = async (obj) => await this.myColl.atomicUpsert(obj);
    
      //删除
      removeOne = async (id) => await this.myColl.findOne(id).remove();
    
      //删除
      removeArr = async (ids) => await this.myColl.findByIds(ids).remove();
    
      //清理
      clear = async () => await this.myColl.find().remove();
    
      //查找
      findOne = async (id) => await this.myColl.findOne(id);
    
    
      //查找 
      findArr = async (ids) => await this.myColl.findByIds(ids);
    
      //查找
      findAll = async () => await this.myColl.find().exec();
    }
    export default OpeBase;

    synchro.js

    数据同步,跟据实际情况调整

    import {
      replicateRxCollection
    } from 'rxdb/plugins/replication';
    
    import {
      api_getNodeList
    } from '@/api/node';
    
    let synchronization = {};
    
    let replicationState = {}; //状态集维护
    
    // 初始化状态
    let initone = async (rxCollection) => {
      let rState = await replicateRxCollection({
        collection: rxCollection,
        replicationIdentifier: 'my-custom-rest-replication',
        live: true,
        liveInterval: 30000,
        //   retryTime: number,
        pull: {
          async handler(latestPullDocument) {
            const limitPerPull = 100;
            const minTimestamp = latestPullDocument ? latestPullDocument.updatedAt : 0;
            const minId = latestPullDocument ? latestPullDocument.Id : 0;
            
            let response = null;
            if (rxCollection.name == "node") {
              let param = {
                // $filter: `updateAt ge ${minTimestamp} and Id gt ${minId}`, // ge:>=  gt:>
                $filter: ` Id lt 10000 `, // ge:>=  gt:>
              }
              response = await api_getNodeList(param);
            }
    
            if (rxCollection.name == "sence") {
              response = await api_getNodeList(param);
            }
            
            // let documentsFromRemote = response; // await response.json();
            // documentsFromRemote.forEach(t => t.id = t.Id.toString());
    
            let documentsFromRemote = response.map(t => {
              return {
                id: t.Id.toString(),
                name: t.Name,
                parentId: t.ParentId,
                updatedAt: t.updatedAt,
                "_deleted": false
              }
            });
    
            
            return {
              documents: documentsFromRemote,
              hasMoreDocuments: documentsFromRemote.length === limitPerPull
            };
          }
        }
      });
      return rState;
    };
    
    // 获取状态
    synchronization.get = async (collectionName, rxCollection) => {
      if (!replicationState[collectionName]) {
        replicationState[collectionName] = await initone(rxCollection);
      }
      return replicationState[collectionName];
    }
    
    //初始化状态
    synchronization.initall = async (rxCollectionArrs) => {
      rxCollectionArrs.forEach(async (rxCollection) => {
        replicationState[rxCollection.name] = await initone(rxCollection);
      });
    }
    
    synchronization.run = async (collectionName) => {
    
      let sss = await replicationState[collectionName].run();
    
    }
    
    export default synchronization;

    实例操作: 

        let mydb = await Database.get();
    
        let demoIns = await mydb.demo.bulkInsert([
          {
            id: "aaaa",
            name: "进坧远在天边aaaaaaaaa",
            updatedAt: Math.round(new Date().getTime() / 1000),
            _deleted: false,
          },
          {
            id: "bbbb",
            name: "节节子子孙孙bbbbbbb",
            updatedAt: Math.round(new Date().getTime() / 1000),
            _deleted: false,
          },
          {
            id: "cccc",
            name: "节点ccccccccccc",
            updatedAt: Math.round(new Date().getTime() / 1000),
            _deleted: false,
          },
        ]);
     
        let sss = mydb.demo.find();
    
        let vc = await sss.exec(); 
    
        let cc = await mydb.demo.find().exec(); 
     
    如需要同步浏览器数据与服务器数据
    在main.js 中的 mounted 同步数据
        let mydb = await Database.get();
        synchronization.initall([mydb.node]);

      

    参考:https://rxdb.info/

  • 相关阅读:
    无法导入panda包解决方法
    VUE学习笔记——基础标签,函数
    jobs指令man手册内容
    linux 部分参数的全名
    bilibiliUP数据爬取——requests库与jason库运用实例
    宝塔面板无法进入phpadmin管理数据库解决办法
    python-spider_BeautifulSoup入门实践(一)安装以及简单的抓取数据
    c++程序设计实践——银行系统
    opencv-学习笔记
    关于pipeline的一篇转载博文https://www.cnblogs.com/midhillzhou/p/5588958.html
  • 原文地址:https://www.cnblogs.com/1285026182YUAN/p/15921771.html
Copyright © 2020-2023  润新知