Ionic2 如何在ionic 2中使用lokijs cordova fs适配器

Ionic2 如何在ionic 2中使用lokijs cordova fs适配器,ionic2,lokijs,Ionic2,Lokijs,我正在尝试在我的ionic 2应用程序中使用lokijs。我能够使用lokijs.js。 当尝试使用适配器持久化时,我无法。我准备好了可以使用lokijs cordova fs适配器。但当我在我的应用程序中引用它时,如下所示:获取一个它无法定位的错误 var LokiCordovaFSAdapter = require("./cordova-file-system-adapter"); 尝试将其添加到my index.html中,并尝试在我的ts文件中创建适配器,如下所示: var adapt

我正在尝试在我的ionic 2应用程序中使用lokijs。我能够使用lokijs.js。 当尝试使用适配器持久化时,我无法。我准备好了可以使用lokijs cordova fs适配器。但当我在我的应用程序中引用它时,如下所示:获取一个它无法定位的错误

var LokiCordovaFSAdapter = require("./cordova-file-system-adapter");
尝试将其添加到my index.html中,并尝试在我的ts文件中创建适配器,如下所示:

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

在这种情况下获取语法错误。有人能举一个如何使用它的例子吗?

Ciao,这在Ionic 2上起作用,所以一步一步地(我在a中这样做了):

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

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

  • 在服务类中使用以下命令:

    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
      });
    }
    
    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}`);
    }
    
  • 使用它(此代码也在服务类中):

    load(){
    让collection=this.db.getCollection('pandas');
    if(集合==null){
    this.pandas=this.db.addCollection('pandas');
    }否则{
    这是熊猫的收藏;
    }
    }
    pandaKamasutra(){
    console.log(“*拯救熊猫…”);
    for(设i=0;i<100;i++)
    插入({name:'Panda'+(i+1),surename:“Whurgh”+i});
    }
    展示熊猫(){
    var results=this.pandas.find({});
    for(让r表示结果)
    log(`%id:${r.$loki},Panda:${r.name}`);
    }
    
  • 我花了一下午的时间来解决这个问题,在浏览了LokiJS和LokiJS cordova fs适配器代码之后,我在Ionic文档中找到了“光”

    希望它也能对您起作用。=]

    有关如何在Ionic2中实现这一点的信息,请参见我在的帖子

    我终于在Ionic2应用程序中运行了它(使用typescript)。确保安装插件
    cordova插件文件
    。然后像Ionic2中的普通提供者一样使用底部的适配器(我在项目中的
    /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
      }
    }
    

    我已经使用了你的帖子,并且能够让它工作。当我试图保存以持久化数据时,数据不会持久化。这是我的代码initLokiDB(EventID){this.db[EventID]=new-loki(EventID+'.db',{autoload:true,autoloadCallback:function(){console.log(“*database-loaded…”),autosave:true,autosaveInterval:1*1000,//每1秒适配器:adapter};}在saveDB中:collection=this.db[id].addCollection(collectionName);收集.插入(数据);this.db[selectedEventID].saveDatabase();喂,你先试过简单的熊猫例子吗?是的,我试过一次。后来,当我尝试使用上述方法时,它失败了。所以现在切换到sqlite。如果这个问题得到解决,想使用loki吗?请分享一个问题示例,我将查找您Pandakamasutra现在是我最喜欢的函数
    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
      }
    }