【问题标题】:how to use lokijs-cordova-fs-adapter in ionic 2如何在 ionic 2 中使用 lokijs-cordova-fs-adapter
【发布时间】:2017-02-22 08:54:19
【问题描述】:

我正在尝试在我的 ionic 2 应用程序中使用 lokijs。我能够使用 lokijs.js。 当试图坚持使用适配器时,我无法做到。我准备好lokijs-cordova-fs-adapter 可以使用了。但是当我在我的应用程序中将其引用如下时:得到一个无法找到的错误。

var LokiCordovaFSAdapter = require("./cordova-file-system-adapter");

尝试在我的 index.html 中添加它并尝试在我的 ts 文件中创建适配器,如下所示:

var adapter = new LokiCordovaFSAdapter({"prefix": "loki"});

在这种情况下出现语法错误。有人可以举例说明如何使用它吗?

【问题讨论】:

    标签: ionic2 lokijs


    【解决方案1】:

    Ciao,这适用于 Ionic 2,所以一步一步来(我在 service 中这样做了):

    1. 检查是否安装了两个依赖项:

      npm install lokijs --save
      npm install loki-cordova-fs-adapter --save
      
    2. 声明并导入以下内容(在类声明之前):

      declare var require: any;
      var loki = require('lokijs');
      var LokiCordovaFSAdapter = require("loki-cordova-fs-adapter");
      var adapter = new LokiCordovaFSAdapter({"prefix": "loki"});
      
    3. 在服务类中使用以下内容:

      db: any; // LokiJS database
      pandas: any; // our DB's document collection object
      
      constructor() {
        console.log("* inicializando...");
      
        this.db = new loki('pandas.db', {
          autoload: true,
          autoloadCallback: function() {
            console.log("* database loaded...")
          },
          autosave: true,
          autosaveInterval: 10 * 1000, //every 10 seconds
          adapter: adapter
        });
      }
      
    4. 使用它(这段代码也在服务类里面):

      load() {
        let collection = this.db.getCollection('pandas');
        if (collection == null) {
          this.pandas = this.db.addCollection('pandas');
        } else {
          this.pandas = collection;
        }
      }
      
      pandaKamasutra() {
        console.log("* Save the pandas...");
        for (let i=0; i < 100; i++)
          this.pandas.insert({ name: 'Panda ' + (i+1), surename: "Whurgh " + i });
      }
      
      showPandas() {
        var results = this.pandas.find({});
        for (let r of results)
          console.log(`% id: ${r.$loki}, Panda: ${r.name}`);
      }
      

    我花了今天下午解决这个问题,在浏览了 LokiJS 和 lokijs-cordova-fs-adapter 代码之后,我在 Ionic 文档 here 中找到了“光”。

    希望它也对你有用。 =]

    【讨论】:

    • 我已经使用了你的帖子并且能够让它发挥作用。当我尝试保存以保持数据时 不持久。这是我的代码 initLokiDB(EventID){ this.db[EventID] = new loki(EventID+'.db', { autoload: true, autoloadCallback: function() { console.log("* database loaded...") } , autosave: true, autosaveInterval: 1 * 1000, //每 1 秒适配器:适配器 }); } 在 saveDB 中:collection=this.db[id].addCollection(collectionName);集合.插入(数据); this.db[selectedEventID].saveDatabase();
    • 你好,你先尝试过简单的 Panda 示例吗?
    • 是的,我试过一次。后来当我尝试使用上述方式时它失败了。所以现在切换到sqlite。如果问题解决了,想使用 loki
    • 分享一个有问题的例子,我帮你看看
    • pandaKamasutra 现在是我最喜欢的功能
    【解决方案2】:

    请参阅我在 https://github.com/cosmith/loki-cordova-fs-adapter/issues/15 的帖子,了解如何在 Ionic2 中执行此操作(在此处转发)。

    我终于在 Ionic2 应用程序(带有打字稿)中运行了它。请务必安装插件cordova-plugin-file。然后像 Ionic2 中的普通 Provider 一样使用底部的适配器(我在我的项目中将它安装在 /src/lib/loki-cordova-fs-adapter 中 - 命名为 index.ts)。

    对于用法,这里是一个例子:

    import { Injectable } from '@angular/core'
    import { Platform } from 'ionic-angular'
    import * as Loki from 'lokijs'
    import * as LokiIndexedAdapter from 'lokijs/src/loki-indexed-adapter'
    import { LokiCordovaFSAdapter } from 'lib/loki-cordova-fs-adapter'
    
    const DATABASE_NAME: string = 'yourFilename.db.json'
    
    @Injectable()
    export class DatabaseProvider {
    
      private lokiOptions: any = {
        verbose: true,
        autosave: true,
        autosaveInterval: 60000,
        autoload: true
      }
      private db: any
    
      public constructor (private platform: Platform, private mobileAdapter: LokiCordovaFSAdapter) {}
    
      public load (successCallback: any): void {
        if (this.db) {
          successCallback()
        } else {
          this.db = this.loadDatabase(DATABASE_NAME, successCallback)
        }
      }
    
      private loadDatabase (databaseName: string, successCallback: any): any {
        this.lokiOptions.autoloadCallback = successCallback
        if (this.platform.is('cordova')) {
          this.lokiOptions.adapter = this.mobileAdapter
        } else {
          this.lokiOptions.adapter = new LokiIndexedAdapter()
        }
        return new Loki(databaseName, this.lokiOptions)
      }
    }
    

    这是适配器:

    import { Injectable } from '@angular/core'
    class LokiCordovaFSAdapterError extends Error {}
    
    // const TAG: string = '[LokiCordovaFSAdapter]'
    declare var window: any
    declare var cordova: any
    
    @Injectable()
    export class LokiCordovaFSAdapter {
      private options: any
    
      public constructor () {
        this.options = {'prefix': 'loki'}
      }
    
      public saveDatabase (dbname: string, dbstring: string, callback: any): any {
        // console.log(TAG, 'saving database')
        this._getFile(dbname,
          (fileEntry) => {
            fileEntry.createWriter(
              (fileWriter) => {
                fileWriter.onwriteend = () => {
                  if (fileWriter.length === 0) {
                    const blob: any = this._createBlob(dbstring, 'text/plain')
                    fileWriter.write(blob)
                    callback()
                  }
                }
                fileWriter.truncate(0)
    
              },
              (err) => {
                // console.log(TAG, 'error writing file', err)
                throw new LokiCordovaFSAdapterError('Unable to write file' + JSON.stringify(err))
              }
            )
          },
          (err) => {
            // console.log(TAG, 'error getting file', err)
            throw new LokiCordovaFSAdapterError('Unable to get file' + JSON.stringify(err))
          }
        )
      }
    
      public loadDatabase (dbname: string, callback: any): void {
        // console.log(TAG, 'loading database')
        this._getFile(dbname,
          (fileEntry) => {
            // console.log('got database file')
            fileEntry.file((file) => {
              const reader: FileReader = new FileReader()
              reader.onloadend = (event: any) => {
                const contents: any = event.target.result
                if (contents.length === 0) {
                  // console.log(TAG, 'database is empty')
                  callback(null)
                } else {
                  // console.log('sending back database')
                  callback(contents)
                }
              }
              reader.readAsText(file)
            }, (err) => {
              // console.log(TAG, 'error reading file', err)
              callback(new LokiCordovaFSAdapterError('Unable to read file' + err.message))
            })
          },
          (err) => {
            // console.log(TAG, 'error getting file', err)
            callback(new LokiCordovaFSAdapterError('Unable to get file: ' + err.message))
          }
        )
      }
    
      public deleteDatabase (dbname: string, callback: any): void {
        window.resolveLocalFileSystemURL(cordova.file.dataDirectory,
          (dir) => {
            const fileName: string = this.options.prefix + '__' + dbname
            dir.getFile(fileName, { create: true },
              (fileEntry) => {
                fileEntry.remove(
                  () => {
                    callback()
                  },
                  (err) => {
                    // console.log(TAG, 'error delete file', err)
                    throw new LokiCordovaFSAdapterError('Unable delete file' + JSON.stringify(err))
                  }
                )
              },
              (err) => {
                // console.log(TAG, 'error delete database', err)
                throw new LokiCordovaFSAdapterError(
                  'Unable delete database' + JSON.stringify(err)
                )
              }
            )
          },
          (err) => {
            throw new LokiCordovaFSAdapterError(
              'Unable to resolve local file system URL' + JSON.stringify(err)
            )
          }
        )
      }
    
      private _getFile (name: string, handleSuccess: any, handleError: any): void {
        // console.log(TAG, 'Retrieving file: ' + name)
        window.resolveLocalFileSystemURL(cordova.file.dataDirectory,
          (dir) => {
            const fileName: string = this.options.prefix + '__' + name
            dir.getFile(fileName, { create: true }, handleSuccess, handleError)
          },
          (err) => {
            throw new LokiCordovaFSAdapterError(
              'Unable to resolve local file system URL' + JSON.stringify(err)
            )
          }
        )
      }
    
      // adapted from http://stackoverflow.com/questions/15293694/blob-constructor-browser-compatibility
      private _createBlob (data: string, datatype: string): any {
        let blob: any
    
        try {
          blob = new Blob([data], { type: datatype })
        } catch (err) {
          window.BlobBuilder = window.BlobBuilder ||
            window.WebKitBlobBuilder ||
            window.MozBlobBuilder ||
            window.MSBlobBuilder
    
          if (err.name === 'TypeError' && window.BlobBuilder) {
            const bb: MSBlobBuilder = new window.BlobBuilder()
            bb.append(data)
            blob = bb.getBlob(datatype)
          } else if (err.name === 'InvalidStateError') {
            // InvalidStateError (tested on FF13 WinXP)
            blob = new Blob([data], { type: datatype })
          } else {
            // We're screwed, blob constructor unsupported entirely
            throw new LokiCordovaFSAdapterError(
              'Unable to create blob' + JSON.stringify(err)
            )
          }
        }
        return blob
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 2016-11-02
      • 2017-02-05
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多