IndexedDB - Dexie JS: динамически создавать магазины

Я работаю с indexedDB для локального хранения данных, с Dexie.js, который довольно удобен как обертка, особенно из-за сложных запросов. На самом деле, я хотел бы создать несколько хранилищ данных по сценариям, которые кажутся сложными.

Чтобы создать новый магазин, вы должны сделать что-то вроде:

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

Если я сделаю что-то вроде Doctors = "Hospital", он все равно создаст магазин с именем "Doctors".

Есть ли способ сделать это?

Кто-нибудь сталкивался с такой же проблемой?

1 ответ

Решение

Допустим, вам нужны три магазина объектов: "Врачи", "Пациенты" и "Больницы", вы должны написать что-то вроде:

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));
});
Другие вопросы по тегам