不使用 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”的索引。

这里出现三个错误:

  1. 你不能在不增加版本号的情况下更改声明,这里没有这样做。
  2. 您不能更改现有数据库的主键。
  3. 未捕获承诺,因此您看不到错误。

看来您的真正意图是将 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);