Dexie.js table.name не работает, хотя таблица находится в свойстве таблиц

Я хочу извлечь все элементы из таблицы в коллекцию, но получаю сообщение об ошибке, что имя таблицы undefined. Вот мой магазин:

db.version(1).stores({
  users: '++id,',
  orgs: '++id,',
  applications: '++id'
})

Затем позже вот мой звонок:

db.orgs.toCollection().count(function (count) {
   console.log(count)
})

Это дает следующую ошибку:

TypeError: Cannot read property 'toCollection' of undefined

Но когда я останавливаю отладчик при вызове и достаточно уверенно набираю db.tables:

1:Table {name: "orgs", schema: TableSchema, _tx: undefined, …}
_tx:undefined
hook:function rv(eventName, subscriber) { … }
name:"orgs"

Любая помощь приветствуется - спасибо.

ОБНОВЛЕНИЕ

Я заметил, что когда я заполнил базу данных при первоначальном создании, я мог получить данные. Поэтому я скопировал этот код в свой шаблон. Однако он все еще терпит неудачу, поэтому должно быть что-то простое, что мне не хватает, вот этот код:

import Dexie from '@/dexie.es.js'

export default {
  name: 'ListOrgs',
  data: () => {
    return {
      orgs: []
    }
  },
  methods: {
    populateOrgs: async function () {
      let db = await new Dexie('myDatabase').open()
      db.orgs.toCollection().count(function (count) {
        console.log(count)
      })
    }
  },
  mounted () {
    this.populateOrgs()
  }
}

person gregwhitworth    schedule 09.07.2018    source источник
comment
Чтобы добавить к этому, я попытался создать фабрику, которая выполняла бы шаблонное создание и открытие базы данных. В этом файле, когда база данных изначально создается и данные заполняются, я могу вызвать это, и это работает. Но даже при непосредственном использовании Dexie выдает ту же ошибку.   -  person gregwhitworth    schedule 10.07.2018


Ответы (1)


Декси имеет два режима

  • Статический — самый распространенный, используемый в большинстве примеров.
  • Динамический — схема не указана в коде.

Статический режим

//
// Static Mode
//
const db = new Dexie('myDatabase');
db.version(1).stores({myTable1: '++'});
db.version(2).stores({myTable1: '++, foo'});
db.myTable1.add({foo: 'bar'}); // OK - dexie knows about myTable1!

Динамический режим

//
// Dynamic Mode
//
const db = new Dexie('myDatabase');
// FAIL: db.myTable1.add({foo: 'bar'}); // myTable1 is unknown to the API.
// Here, you must wait for db to open, and then access tables using db.table() method:
db.open().then(db => {
  const myTable = db.table('myTable');
  if (myTable) {
    myTable.add({foo: 'bar'});
  }
}).catch(error => {
  console.error(error);
});

Если опустить какую-либо спецификацию version(), Dexie просто попытается открыть любую существующую базу данных с тем же именем, независимо от версии или схемы. Но он не создаст неявные свойства таблицы в экземпляре db.

Когда динамический режим полезен

Динамический режим может быть полезен при создании произвольной утилиты базы данных, которая должна адаптироваться к любой базе данных indexedDB, например к обозревателю БД. Динамический режим также может быть полезен, когда код javascript по своей структуре не знает о схеме (какие таблицы должны быть запрошены и какие существуют индексы).

Преимущества статического режима

  • Не нужно ждать завершения db.open().
  • Автоматическое создание БД при необходимости. Нет сложного кода приложения для управления версиями базы данных.
  • Автоматическое заполнение БД при необходимости.

Шаблоны проектирования в статическом режиме

db.js

import Dexie from 'dexie';

//
// Let this module do several things:
//
//  * Create the singleton Dexie instance for your application.
//  * Declare it's schema (and version history / migrations)
//  * (Populate default data http://dexie.org/docs/Dexie/Dexie.on.populate)
// 

export const db = new Dexie('myDatabase');

db.version(1).stores({
  users: '++id,',
  orgs: '++id,',
  applications: '++id'
});

db.on('populate', () => {
  return db.orgs.bulkAdd([
    {'foo': 'bar'},
  ]);
});

app.js

import {db} from './db';

// Wherever you use the database, include your own db module
// instead of creating a new Dexie(). This way your code will
// always make sure to create or upgrade your database whichever
// of your modules that comes first in accessing the database.
//
// You will not have to take care of creation or upgrading scenarios.
//
// Let Dexie do that for you instead.
// 

async function countOrgs() {
  return await db.orgs.count();
}
person David Fahlander    schedule 10.07.2018