【问题标题】:IndexedDB - Dexie JS : Dynamically create storesIndexedDB - Dexie JS:动态创建商店
【发布时间】:2015-01-15 17:30:39
【问题描述】:

我正在使用 indexedDB 进行本地数据存储,使用 Dexie.js 作为包装器非常好,特别是因为高级查询。 其实我想通过脚本创建几个datastore,看起来很复杂。

要创建新商店,您可以执行以下操作:

db.version(2).stores({
    Doctors: "++" + strFields
});

如果我执行 Doctors = "Hospital" 之类的操作,它仍然会创建名称为 "Doctors" 的商店。

有没有办法做到这一点?

有人遇到过同样的问题吗?

【问题讨论】:

  • 最简单的方法就是使用 indexedDB API。
  • @Josh - 不是真的。我正在使用直接 API,并放弃了它。我更喜欢 dexie 必须更好。

标签: javascript indexeddb dexie


【解决方案1】:

假设你想要三个对象存储“Doctors”、“Patients”和“Hospitals”,你可以这样写:

var db = new Dexie ("your-database-name");
db.version(1).stores({
    Doctors: "++id,name",
    Patients: "ssn",
    Hospitals: "++id,city"
});
db.open();

请注意,您只需指定主键和所需的索引。主键可以选择自动递增(“++”前缀)。您可以根据需要向对象添加任意数量的属性,而无需在索引列表中指定每个属性。

db.Doctors.add({name: "Phil", shoeSize: 83});
db.Patients.add({ssn: "721-07-446", name: "Randle Patrick McMurphy"});
db.Hospitals.add({name: "Johns Hopkins Hospital", city: "Baltimore"});

并查询不同的商店:

db.Doctors.where('name').startsWithIgnoreCase("ph").each(function (doctor) {
    alert ("Found doctor: " + doctor.name);
});

db.Hospitals.where('city').anyOf("Baltimore", "NYC").toArray(function (hospitals) {
   alert ("Found hospitals: " + JSON.stringify(hospitals, null, 4));
});

【讨论】:

  • 请注意,如果您要发布第二个版本,请保留所有 db.version(1) 语句和相应的 db.version(2) 语句。
  • 这些商店不是动态创建的。在创建它们之前,您必须知道需要哪些商店。此外,使用 new Dexie(dbName) 总是会导致 db.verno = 0 因此无法正确动态地增加版本。所有这些都应该是先验的。我说的对吗?
  • Indexeddb 是围绕静态创建商店而设计的,Dexie 在主要用例中反映了这一点。为了动态地 att 商店,您需要进行版本升级。 Dexie 也支持这个用例,这里有描述:dexie.org/docs/Dexie/Dexie.open()#sample-dynamic-mode
猜你喜欢
  • 1970-01-01
  • 2020-03-30
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
  • 2012-05-28
相关资源
最近更新 更多