未创建使用Dexie的 IndexedDB

b1zrtrql  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(1)|浏览(220)

我有一个Angular 的应用程序,我试图插入到一个 IndexedDB 。问题是数据库没有得到创建。
下面是我在数据库中插入一个条目的一段代码。

createImageFromBlob(ficname:any , image: Blob) {
    let reader = new FileReader();
    reader.addEventListener("load", (evt) => {
      let res = evt.target.result;

      // Store Data URL in localStorage
      try {
        if (typeof res === "string") {
          localStorage.setItem(ficname, res);
          this.dixieDbService.addNewImage(ficname, res).then(r => console.log("inserted: "));
        }
      }
      catch (e) {
        console.log("Storage failed: " + e);
      }
    }, false);
    if (image) {
      reader.readAsDataURL(image);
    }
  }

下面是bd.ts

import Table = Dexie.Table;
import Dexie from "dexie";

export interface ImageList {
  id?: number;
  imgName: string;
  imgDataUrlValue: string|ArrayBuffer;
}

export class AppDB extends Dexie {
  imageList!: Table<ImageList, number>;

  constructor() {
    super('ngdexieliveQuery');
    this.version(3).stores({
      imageList: '++id'
    });
   // this.on('populate', () => this.populate());
  }
  
}

export const db = new AppDB();

以下是服务类:

import {Injectable} from "@angular/core";
import {liveQuery} from "dexie";
import {db, ImageList} from "../dixie/db";

@Injectable()
export class DixieIndexedDbService {

  imageList$ = liveQuery(() => db.imageList.toArray());
  listName = 'My local image list';

  async addNewImage(imgName:string, imgDataVal:any) {
    await db.imageList.add({
      imgName: imgName,
      imgDataUrlValue:imgDataVal
    });
  }

  async getImgDataValue(imgName:string) {
    return db.imageList.get({imgName: imgName});
  }

}

我有stackblitz上的示例工作代码:
https://stackblitz.com/edit/angular-ivy-znzhv8

8zzbczxx

8zzbczxx1#

如果在调用Dexie的构造函数时未提供任何选项,则要创建数据库...
1.发出对open的调用
1.或者,向数据库发出一个查询。在上述情况下(OP),在函数createImageFromBlob中,load事件处理程序应该已经被调用,调用DexieService方法,该方法反过来应该在数据库上发出一个查询,作为指定实现的一部分。发布后,我们应该有一个数据库。
AppDB类别,并呼叫open ...

import Table = Dexie.Table;
import Dexie from "dexie";

export interface ImageList {
  id?: number;
  imgName: string;
  imgDataUrlValue: string|ArrayBuffer;
}

export class AppDB extends Dexie {
  imageList!: Table<ImageList, number>;

  constructor() {
    super('ngdexieliveQuery');
    this.version(3).stores({
      imageList: '++id'
    });
    this.open(); // <---- Missing in OP
   // this.on('populate', () => this.populate());
  }
  
}

export const db = new AppDB();

相关问题