不使用 toArray() 获取 Dexie 值
Obtain Dexie values without using toArray()
我有以下代码:
(function () {
var gameDataLocalStorageName = "myTest3";
var defaultUserSettings = {
volumes: {
musicVolume: 0.3,
sfxVolume: 0.5,
voicesVolume: 1
}
};
var savedGames = [
{
screenshot: "data uri here",
day: "1",
month: "1",
year: "1",
time: "1",
gameData: {
fonts: [{
id: 123,
name: "Arial"
}],
globalSpeeches: {
anotherVal: "something"
}
}
}
];
console.log(gameDataLocalStorageName);
console.log(defaultUserSettings);
console.log(savedGames);
/* Create db START */
var db = new Dexie(gameDataLocalStorageName);
db.version(1).stores({
usersData: ""
});
db.usersData.put(defaultUserSettings, 'userSettings');
db.usersData.put(savedGames, 'savedGames');
}());
/* Create db END */
/* Recall db START */
setTimeout(function(){
var db2 = new Dexie("myTest3");
db2.version(1).stores({
usersData: "userSettings,savedGames"
});
db2.usersData.toArray().then(function (results) {
console.log("User settings is: ", results[1]);
console.log("Saved games is: ", results[0]);
});
}, 3000);
运行良好。但是,我如何才能再次获取数据而不必呈现为数组 toArray()
。目前要获得它们,我必须对 results[0]
和 results[1]
进行硬编码,这也与我将它们输入数据库的顺序不同。
理想情况下我想做这样的事情:
db2.get('usersData.userSettings');
db2.get('usersData.savedGames');
示例显示您正在更改不受支持的主键:
第一个声明指定了一个 table“usersData”,带有出站主键:
db.version(1).stores({
usersData: ""
});
然后在 setTimout 回调中,您重新声明它:
db2.version(1).stores({
usersData: "userSettings,savedGames"
});
...这意味着您需要来自 属性“userSettings”的 inbound 主键和 属性“savedGames”的索引。
这里出现三个错误:
- 你不能在不增加版本号的情况下更改声明,这里没有这样做。
- 您不能更改现有数据库的主键。
- 未捕获承诺,因此您看不到错误。
看来您的真正意图是将 Dexie 用作 key/value 商店,这完全可以,但比示例显示的要简单得多。
如果您使用某个键 put()(或 add())一个值,您将使用 get() 检索相同的值。
如果是这样,请尝试以下操作:
db.version(1).stores({
usersData: "",
});
并且不要忘记抓住承诺或等待并做 try/catch。
(async ()=>{
await db.usersData.put(defaultUserSettings, 'userSettings')
await db.usersData.put(savedGames, 'savedGames');
// Get using key:
const userSettings = await db.usersData.get('userSettings');
console.log("User settings is: ", userSettings);
const savedGames = await db.usersData.get('savedGames');
console.log("User settings is: ", savedGames);
})().catch(console.error);
但是,将整个数组作为值放入 key/value 存储并不是最佳选择。
也许只有两个 table 的“userSettings”和“savedGames”,其中每个保存的游戏都是它自己的行?您会支持多个用户还是只支持一个用户?如果有多个,您可以将索引“userId”添加到您的 tables.
如果是这样,请尝试以下操作:
db.version(2).stores({
userSettings: "userId" // userId is primary key
savedGames: "++gameId, userId" // incremented id and userId is foreign key
});
(async ()=>{
await db.userSettings.put({...defaultUserSettings, userId: "fooUser"});
await db.savedGames.bulkPut(savedGames.map(game =>
({...game, userId: "fooUser"}));
// Get user settings:
const userSettings = await db.usersData.get('fooUser');
console.log("User settings is: ", userSettings);
const savedGames = await db.usersData.where({userId: "fooUser"}).toArray();
console.log("Saved games for fooUser are: ", savedGames);
})().catch(console.error);
我有以下代码:
(function () {
var gameDataLocalStorageName = "myTest3";
var defaultUserSettings = {
volumes: {
musicVolume: 0.3,
sfxVolume: 0.5,
voicesVolume: 1
}
};
var savedGames = [
{
screenshot: "data uri here",
day: "1",
month: "1",
year: "1",
time: "1",
gameData: {
fonts: [{
id: 123,
name: "Arial"
}],
globalSpeeches: {
anotherVal: "something"
}
}
}
];
console.log(gameDataLocalStorageName);
console.log(defaultUserSettings);
console.log(savedGames);
/* Create db START */
var db = new Dexie(gameDataLocalStorageName);
db.version(1).stores({
usersData: ""
});
db.usersData.put(defaultUserSettings, 'userSettings');
db.usersData.put(savedGames, 'savedGames');
}());
/* Create db END */
/* Recall db START */
setTimeout(function(){
var db2 = new Dexie("myTest3");
db2.version(1).stores({
usersData: "userSettings,savedGames"
});
db2.usersData.toArray().then(function (results) {
console.log("User settings is: ", results[1]);
console.log("Saved games is: ", results[0]);
});
}, 3000);
运行良好。但是,我如何才能再次获取数据而不必呈现为数组 toArray()
。目前要获得它们,我必须对 results[0]
和 results[1]
进行硬编码,这也与我将它们输入数据库的顺序不同。
理想情况下我想做这样的事情:
db2.get('usersData.userSettings');
db2.get('usersData.savedGames');
示例显示您正在更改不受支持的主键:
第一个声明指定了一个 table“usersData”,带有出站主键:
db.version(1).stores({
usersData: ""
});
然后在 setTimout 回调中,您重新声明它:
db2.version(1).stores({
usersData: "userSettings,savedGames"
});
...这意味着您需要来自 属性“userSettings”的 inbound 主键和 属性“savedGames”的索引。
这里出现三个错误:
- 你不能在不增加版本号的情况下更改声明,这里没有这样做。
- 您不能更改现有数据库的主键。
- 未捕获承诺,因此您看不到错误。
看来您的真正意图是将 Dexie 用作 key/value 商店,这完全可以,但比示例显示的要简单得多。
如果您使用某个键 put()(或 add())一个值,您将使用 get() 检索相同的值。
如果是这样,请尝试以下操作:
db.version(1).stores({
usersData: "",
});
并且不要忘记抓住承诺或等待并做 try/catch。
(async ()=>{
await db.usersData.put(defaultUserSettings, 'userSettings')
await db.usersData.put(savedGames, 'savedGames');
// Get using key:
const userSettings = await db.usersData.get('userSettings');
console.log("User settings is: ", userSettings);
const savedGames = await db.usersData.get('savedGames');
console.log("User settings is: ", savedGames);
})().catch(console.error);
但是,将整个数组作为值放入 key/value 存储并不是最佳选择。
也许只有两个 table 的“userSettings”和“savedGames”,其中每个保存的游戏都是它自己的行?您会支持多个用户还是只支持一个用户?如果有多个,您可以将索引“userId”添加到您的 tables.
如果是这样,请尝试以下操作:
db.version(2).stores({
userSettings: "userId" // userId is primary key
savedGames: "++gameId, userId" // incremented id and userId is foreign key
});
(async ()=>{
await db.userSettings.put({...defaultUserSettings, userId: "fooUser"});
await db.savedGames.bulkPut(savedGames.map(game =>
({...game, userId: "fooUser"}));
// Get user settings:
const userSettings = await db.usersData.get('fooUser');
console.log("User settings is: ", userSettings);
const savedGames = await db.usersData.where({userId: "fooUser"}).toArray();
console.log("Saved games for fooUser are: ", savedGames);
})().catch(console.error);