Dexie.js table.name 无法正常工作,即使 table 在 table 下 属性
Dexie.js table.name isn't working even though the table is under the tables property
我想将 table 中的所有项目提取到一个集合中,但收到 table 名称为 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()
}
}
Dexie 有两种模式
- 静态 - 大多数样本中最常用的一种。
- 动态 - 代码中未指定架构。
静态模式
//
// 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 将尝试打开任何具有相同名称的现有数据库,无论版本或架构如何。但它不会在数据库实例上创建隐式 table 属性。
当动态模式有用时
动态模式在构建应适应任何索引数据库的任意数据库实用程序(例如数据库浏览器)时非常有用。当 javascript 代码在设计上不知道模式(预期查询什么 table 以及有什么索引)时,动态模式也很有用。
静态模式的好处
- 无需等待 db.open() 完成。
- 需要时自动创建数据库。没有复杂的应用程序代码来处理数据库版本控制。
- 需要时自动DB population。
静态模式下的设计模式
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();
}
我想将 table 中的所有项目提取到一个集合中,但收到 table 名称为 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()
}
}
Dexie 有两种模式
- 静态 - 大多数样本中最常用的一种。
- 动态 - 代码中未指定架构。
静态模式
//
// 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 将尝试打开任何具有相同名称的现有数据库,无论版本或架构如何。但它不会在数据库实例上创建隐式 table 属性。
当动态模式有用时
动态模式在构建应适应任何索引数据库的任意数据库实用程序(例如数据库浏览器)时非常有用。当 javascript 代码在设计上不知道模式(预期查询什么 table 以及有什么索引)时,动态模式也很有用。
静态模式的好处
- 无需等待 db.open() 完成。
- 需要时自动创建数据库。没有复杂的应用程序代码来处理数据库版本控制。
- 需要时自动DB population。
静态模式下的设计模式
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();
}