Ionic2 如何在ionic 2中使用lokijs cordova fs适配器
我正在尝试在我的ionic 2应用程序中使用lokijs。我能够使用lokijs.js。 当尝试使用适配器持久化时,我无法。我准备好了可以使用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
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}`);
}
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
}
}