Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🍁 Indexeddb #1638

Merged
merged 5 commits into from
Jun 19, 2022
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
πŸ‘Ύ smth
  • Loading branch information
Rnbsov committed May 15, 2022
commit 2bf14fce8f10bc97d6ec965c3a83b0104924549c
75 changes: 49 additions & 26 deletions 6-data-storage/03-indexeddb/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ libs:

IndexedDB - это встроСнная Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…, Π±ΠΎΠ»Π΅Π΅ мощная, Ρ‡Π΅ΠΌ `localStorage`.

- Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ/Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ: доступны нСсколько Ρ‚ΠΈΠΏΠΎΠ² ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, Π° значСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ (ΠΏΠΎΡ‡Ρ‚ΠΈ) Π»ΡŽΠ±Ρ‹ΠΌΠΈ.
- Π₯Ρ€Π°Π½ΠΈΡ‚ практичСски Π»ΡŽΠ±Ρ‹Π΅ значСния ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π°ΠΌ, нСсколько Ρ‚ΠΈΠΏΠΎΠ² ΠΊΠ»ΡŽΡ‡Π΅ΠΉ
- ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ для надёТности.
- ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ запросы Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈ индСксы.
- ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ большС Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Π΅ΠΌ `localStorage`.
Expand All @@ -18,6 +18,12 @@ IndexedDB - это встроСнная Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…, Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `async/await` с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ, которая основана Π½Π° промисах, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ <https://github.com/jakearchibald/idb>. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π½ΠΎ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ° Π½Π΅ идСальна, ΠΎΠ½Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ события. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π½Π°Ρ‡Π½Ρ‘ΠΌ с событий, Π° Π·Π°Ρ‚Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° разбСрёмся Π² IndexedDB, рассмотрим ΠΈ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΡƒ.

```smart header="Π“Π΄Π΅ хранятся Π΄Π°Π½Π½Ρ‹Π΅?"
ВСхничСски Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ хранятся Π² домашнСм ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ посСтитСля вмСстС с настройками Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ ΠΈ Ρ‚.Π΄.

Π£ Ρ€Π°Π·Π½Ρ‹Ρ… Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ОБ Π΅ΡΡ‚ΡŒ своС собствСнноС нСзависимоС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.
```

## ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…

Для Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с IndexedDB Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ….
Expand Down Expand Up @@ -46,7 +52,9 @@ let openRequest = indexedDB.open(name, version);

Π­Ρ‚ΠΎ событиС Ρ‚Π°ΠΊΠΆΠ΅ сработаСт, Ссли Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π΅Ρ‰Ρ‘ Π½Π΅ сущСствуСт, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π² этом ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.

НапримСр, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… с вСрсиСй `1` ΠΈ выполняСм ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ `upgradeneeded`:
Допустим, ΠΌΡ‹ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ нашСго прилоТСния.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… с вСрсиСй `1` ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ `upgradeneeded` Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

```js
let openRequest = indexedDB.open("store", *!*1*/!*);
Expand All @@ -66,12 +74,13 @@ openRequest.onsuccess = function() {
};
```

Когда ΠΌΡ‹ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ Π²Ρ‚ΠΎΡ€ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ:
Π—Π°Ρ‚Π΅ΠΌ, ΠΏΠΎΠ·ΠΆΠ΅, ΠΌΡ‹ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ 2-ю Π²Π΅Ρ€ΡΠΈΡŽ.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΅Π³ΠΎ с вСрсиСй `2` ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

```js
let openRequest = indexedDB.open("store", *!*2*/!*);

// ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ сущСствованиС ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ вСрсии Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости:
openRequest.onupgradeneeded = function(event) {
// вСрсия ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… мСньшС 2 (ΠΈΠ»ΠΈ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ сущСствуСт)
let db = openRequest.result;
Expand Down Expand Up @@ -109,9 +118,12 @@ let deleteRequest = indexedDB.deleteDatabase(name)

Π Π°Π· ΡƒΠΆ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΏΡ€ΠΎ вСрсионированиС, рассмотрим ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ с этим Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

Допустим, ΠΏΠΎΡΠ΅Ρ‚ΠΈΡ‚Π΅Π»ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π» наш сайт Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°, с Π±Π°Π·ΠΎΠΉ вСрсии 1.
Допустим:
1. ΠŸΠΎΡΠ΅Ρ‚ΠΈΡ‚Π΅Π»ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π» наш сайт Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°, с Π±Π°Π·ΠΎΠΉ вСрсии `1`.
2. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ выпустили ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ наш ΠΊΠΎΠ΄ обновился.
3. И Π·Π°Ρ‚Π΅ΠΌ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΠΎΡΠ΅Ρ‚ΠΈΡ‚Π΅Π»ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π» наш сайт Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π²Ρ‹ΠΊΠ°Ρ‚ΠΈΠ»ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΠΎΡΠ΅Ρ‚ΠΈΡ‚Π΅Π»ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π» наш сайт Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ наш сайт, Π½ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ соСдинСниС с Π±Π°Π·ΠΎΠΉ вСрсии 1, Π° другая пытаСтся ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ Π±Π°Π·Ρ‹ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ `upgradeneeded`.
Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ наш сайт, Π½ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ соСдинСниС с Π±Π°Π·ΠΎΠΉ вСрсии 1, Π° другая пытаСтся ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ Π±Π°Π·Ρ‹ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ `upgradeneeded`.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… всСго ΠΎΠ΄Π½Π° Π½Π° Π΄Π²Π΅ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ сайт, ΠΎΠ΄ΠΈΠ½ источник. И ΠΎΠ½Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ вСрсии 1 ΠΈ 2. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π° Π²Π΅Ρ€ΡΠΈΡŽ 2, всС соСдинСния ΠΊ вСрсии 1 Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹.

Expand All @@ -133,27 +145,31 @@ openRequest.onsuccess = function() {
*!*
db.onversionchange = function() {
db.close();
alert("Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… устарСла, поТалуста, ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ страницу.")
alert("Database is outdated, please reload the page.")
Rnbsov marked this conversation as resolved.
Show resolved Hide resolved
};
*/!*

// ...Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… доступна ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ db...
// ...Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Π³ΠΎΡ‚ΠΎΠ²Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΅Π΅...
};

*!*
openRequest.onblocked = function() {
// Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ соСдинСниС ΠΊ Ρ‚ΠΎΠΉ ΠΆΠ΅ Π±Π°Π·Π΅
// ΠΈ ΠΎΠ½ΠΎ Π½Π΅ Π±Ρ‹Π»ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎ послС срабатывания Π½Π° Π½Ρ‘ΠΌ db.onversionchange
// это событиС Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ссли ΠΌΡ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ onversionchange

// это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ соСдинСниС с Ρ‚ΠΎΠΉ ΠΆΠ΅ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…
// ΠΈ ΠΎΠ½ Π½Π΅ Π±Ρ‹Π» Π·Π°ΠΊΡ€Ρ‹Ρ‚ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ для Π½Π΅Π³ΠΎ сработал db.onversionchange
};
*/!*
```

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ:
...Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, здСсь ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ:

1. ДобавляСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ `db.onversionchange` послС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ открытия Π±Π°Π·Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ обновлСния.
2. ДобавляСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ `openRequest.onblocked` для ситуаций, ΠΊΠΎΠ³Π΄Π° староС соСдинСниС Π½Π΅ Π±Ρ‹Π»ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎ. Π’Π°ΠΊΠΎΠ³ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚, Ссли ΠΌΡ‹ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π΅Π³ΠΎ Π² `db.onversionchange`.
1. ΠŸΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Ρ‚Π΅Π»ΡŒ `db.onversionchange` сообщаСт Π½Π°ΠΌ ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ обновлСния, Ссли тСкущая вСрсия Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… устарСла.
Rnbsov marked this conversation as resolved.
Show resolved Hide resolved
2. ΠŸΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Ρ‚Π΅Π»ΡŒ `OpenRequest.onblocked` сообщаСт Π½Π°ΠΌ ΠΎΠ± ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ ситуации: Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС Π΅ΡΡ‚ΡŒ соСдинСниС с ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ вСрсиСй, ΠΈ ΠΎΠ½ΠΎ Π½Π΅ закрываСтся, поэтому Π½ΠΎΠ²ΠΎΠ΅ соСдинСниС ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

Π•ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹. НапримСр, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅ "мягко" Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ соСдинСниС Π² `db.onversionchange`, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄ этим. НовоС ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‰Π΅Π΅ соСдинСниС Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΎ сразу послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ `db.onversionchange` Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, Π½Π΅ Π·Π°ΠΊΡ€Ρ‹Π² соСдинСниС, ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π² Π½ΠΎΠ²ΠΎΠΉ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ посСтитСля Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ старыС для обновлСния.
ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅ изящно ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ с Π²Π΅Ρ‰Π°ΠΌΠΈ Π² `db.onversionchange`, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Ρ‚ΡŒ ΠΏΠΎΡΠ΅Ρ‚ΠΈΡ‚Π΅Π»ΡŽ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π΄ΠΎ закрытия соСдинСния ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Или Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ Π·Π°ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π² `db.onversionchange`, Π° вмСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ `onblocked` (Π½Π° Π½ΠΎΠ²ΠΎΠΉ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ΡŒ посСтитСля, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ новая вСрсия Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π°, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ Π½Π΅ Π·Π°ΠΊΡ€ΠΎΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ.

Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ происходит Ρ€Π΅Π΄ΠΊΠΎ, Π½ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊΠ°ΠΊ-Ρ‚ΠΎ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ, хотя Π±Ρ‹ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ `onblocked`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наш скрипт Π½Π΅ "ΡƒΠΌΠΈΡ€Π°Π»" ΠΌΠΎΠ»Ρ‡Π°, удивляя посСтитСля.

Expand Down Expand Up @@ -182,6 +198,7 @@ IndexedDB ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ [стандартный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сСри
Но для Π½Π°Ρ‡Π°Π»Π° Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.

Бинтаксис для создания Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²:

```js
db.createObjectStore(name[, keyOptions]);
```
Expand All @@ -196,6 +213,7 @@ db.createObjectStore(name[, keyOptions]);
Если ΠΏΡ€ΠΈ создании Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ `keyOptions`, Ρ‚ΠΎ Π½Π°ΠΌ потрСбуСтся явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ ΠΏΠΎΠ·ΠΆΠ΅, ΠΏΡ€ΠΈ сохранСнии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

НапримСр, это Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свойство `id` ΠΊΠ°ΠΊ ΠΊΠ»ΡŽΡ‡:

```js
db.createObjectStore('books', {keyPath: 'id'});
```
Expand All @@ -205,6 +223,7 @@ db.createObjectStore('books', {keyPath: 'id'});
Π­Ρ‚ΠΎ тСхничСскоС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅. Π’Π½Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΌΡ‹ смоТСм Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ/ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ/ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ созданы/ΡƒΠ΄Π°Π»Π΅Π½Ρ‹/ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя обновлСния вСрсии Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

Для обновлСния вСрсии Π±Π°Π·Ρ‹ Π΅ΡΡ‚ΡŒ Π΄Π²Π° основных ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°:

1. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ обновлСния ΠΏΠΎ вСрсиям: с 1 Π½Π° 2, с 2 Π½Π° 3 ΠΈ Ρ‚.Π΄. ΠŸΠΎΡ‚ΠΎΠΌ Π² `upgradeneeded` ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ вСрсии (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π±Ρ‹Π»Π° 2, сСйчас 4) ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ обновлСния для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΉ вСрсии (2 Π½Π° 3, Π·Π°Ρ‚Π΅ΠΌ 3 Π½Π° 4).
2. Или ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π·ΡΡ‚ΡŒ список ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ `db.objectStoreNames`. Π­Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ являСтся [DOMStringList](https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#domstringlist), Π² Π½Ρ‘ΠΌ Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ `contains(name)`, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ сущСствованиС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π΅ΡΡ‚ΡŒ ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Ρ‚.

Expand All @@ -224,7 +243,6 @@ openRequest.onupgradeneeded = function() {
};
```


Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²:

```js
Expand All @@ -238,6 +256,7 @@ db.deleteObjectStore('books')
Вранзакция - это Π³Ρ€ΡƒΠΏΠΏΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ»ΠΈ всС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹, ΠΈΠ»ΠΈ всС Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ (всё ΠΈΠ»ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ).

НапримСр, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠΊΡƒΠΏΠ°Π΅Ρ‚, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ:

1. Π’Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ дСньги с Π΅Π³ΠΎ счёта.
2. ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΅ΠΌΡƒ ΠΏΠΎΠΊΡƒΠΏΠΊΡƒ.

Expand Down Expand Up @@ -460,10 +479,13 @@ request.onerror = function(event) {
## Поиск ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π°ΠΌ

Π•ΡΡ‚ΡŒ Π΄Π²Π° основных Π²ΠΈΠ΄Π° поиска Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²:
1. По ΠΊΠ»ΡŽΡ‡Ρƒ ΠΈΠ»ΠΈ ΠΏΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρƒ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. Π’ΠΎ Π΅ΡΡ‚ΡŒ: ΠΏΠΎ `book.id` Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ "books".
2. По полям ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `book.price`.

Π‘Π½Π°Ρ‡Π°Π»Π° Π΄Π°Π²Π°ΠΉΡ‚Π΅ разбСрёмся с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ `(1)`.
1. По Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΊΠ»ΡŽΡ‡Π° ΠΈΠ»ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρƒ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. Π’ нашСм Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ "books" это Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ `book.id `.
2. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ поля ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `book.price`. Для этого ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»Π°ΡΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ структура Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ°Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ "index".

### По ΠΊΠ»ΡŽΡ‡Ρƒ

Π‘Π½Π°Ρ‡Π°Π»Π° Π΄Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся с ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ поиска: ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ поиска ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π»ΠΈΠ±ΠΎ Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ, Π»ΠΈΠ±ΠΎ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ "запросы с Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ" -- [IDBKeyRange](https://www.w3.org/TR/IndexedDB/#keyrange) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π΄Π°ΡŽΡ‚ "Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ".

Expand All @@ -474,7 +496,9 @@ request.onerror = function(event) {
- `IDBKeyRange.bound(lower, upper, [lowerOpen], [upperOpen])` ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚: ΠΌΠ΅ΠΆΠ΄Ρƒ `lower` ΠΈ `upper`, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ `open` Ρ€Π°Π²Π΅Π½ `true`.
- `IDBKeyRange.only(key)` -- Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ состоит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° `key`, Ρ€Π΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.

ВсС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ поиска ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ `query`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, Π»ΠΈΠ±ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ:
ΠžΡ‡Π΅Π½ΡŒ скоро ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ практичСскиС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΡ… использования.

Для выполнСния фактичСского поиска ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. Они ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ `query`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, Π»ΠΈΠ±ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ:

- `store.get(query)` -- поиск ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ значСния ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ ΠΈΠ»ΠΈ ΠΏΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρƒ.
- `store.getAll([query], [count])` -- поиск всСх Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² `count`.
Expand Down Expand Up @@ -509,7 +533,6 @@ books.getAllKeys(IDBKeyRange.lowerBound('js', true))
ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ запросы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΈΡ… Π² порядкС сортировки ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.
```


## Поиск ΠΏΠΎ индСксированному полю

Для поиска ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ полям ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ "индСкс" (index).
Expand Down Expand Up @@ -592,6 +615,7 @@ let request = priceIndex.getAll(IDBKeyRange.upperBound(5));
- **`delete(query)`** -- ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… запросу Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

НапримСр:

```js
// ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠ½ΠΈΠ³Ρƒ с id='js'
books.delete('js');
Expand All @@ -610,6 +634,7 @@ request.onsuccess = function() {
```

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всё:

```js
books.clear(); // ΠΎΡ‡ΠΈΡ‰Π°Π΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.
```
Expand All @@ -618,9 +643,7 @@ books.clear(); // ΠΎΡ‡ΠΈΡ‰Π°Π΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.

Π’Π°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΊΠ°ΠΊ `getAll/getAllKeys` Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ массив ΠΊΠ»ΡŽΡ‡Π΅ΠΉ/Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Но Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ, большС, Ρ‡Π΅ΠΌ доступно памяти.

Π’ΠΎΠ³Π΄Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ `getAll` Π²Π΅Ρ€Π½Ρ‘Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС записи Π² массивС.
Но Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ, большС, Ρ‡Π΅ΠΌ доступно памяти. Π’ΠΎΠ³Π΄Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ `getAll` Π²Π΅Ρ€Π½Ρ‘Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС записи Π² массивС.

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ?

Expand All @@ -631,6 +654,7 @@ books.clear(); // ΠΎΡ‡ΠΈΡ‰Π°Π΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.
Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ отсортировано ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ, курсор ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Ρƒ Π² порядкС хранСния ΠΊΠ»ΡŽΡ‡Π΅ΠΉ (ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ).

Бинтаксис:

```js
// ΠΊΠ°ΠΊ getAll, Π½ΠΎ с использованиСм курсора:
let request = store.openCursor([query], [direction]);
Expand Down Expand Up @@ -728,7 +752,6 @@ try {
} catch(err) {
console.log('ошибка', err.message);
}

```

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас красивый "плоский асинхронный" ΠΊΠΎΠ΄ ΠΈ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ `try..catch`.
Expand Down Expand Up @@ -771,6 +794,7 @@ await inventory.add({ id: 'js', price: 10, created: new Date() }); // Ошибк
Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ `inventory.add` послС `fetch` `(*)` Π½Π΅ сработаСт, сгСнСрируСтся ошибка "inactive transaction", ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ транзакция ΡƒΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚Π° ΠΊ этому Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

РСшСниС Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ IndexedDB: Π»ΠΈΠ±ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, Π»ΠΈΠ±ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π° части.

1. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всё, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.
2. Π—Π°Ρ‚Π΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ….

Expand Down Expand Up @@ -803,8 +827,7 @@ IndexedDB ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ "localStorage Π½Π° стС

1. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΡƒ Π½Π°Π΄ промисами, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ [idb](https://github.com/jakearchibald/idb).
2. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…: `idb.openDb(name, version, onupgradeneeded)`
- Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ индСксов происходит Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ `onupgradeneeded`.
- ОбновлСниС вСрсии - Π»ΠΈΠ±ΠΎ сравнивая Π½ΠΎΠΌΠ΅Ρ€Π° вСрсий, Π»ΠΈΠ±ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ сущСствуСт, Π° Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚.
- Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ индСксы Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ `onupgradeneeded` ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ вСрсии, Ссли это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ
3. Для запросов:
- Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ `db.transaction('books')` (ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ readwrite, Ссли Π½Π°Π΄ΠΎ).
- ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² `transaction.objectStore('books')`.
Expand Down