IndexedDB के साथ काम करना

इस गाइड में IndexedDB API. हम जेक आर्चिबाल्ड की indexedDB का वादा किया गया लाइब्रेरी, जो IndexedDB API से काफ़ी मिलती-जुलती है, लेकिन इसमें प्रॉमिस का इस्तेमाल किया जाता है, जो कम अवधि का सिंटैक्स पाने के लिए, await करें. यह एपीआई को आसान बनाता है, जबकि वह भी लंबे समय तक बरकरार रखे.

IndexedDB क्या है?

IndexedDB एक बड़ा, NoSQL स्टोरेज सिस्टम है, जो उपयोगकर्ता के ब्राउज़र में मौजूद किसी भी चीज़ के बारे में जानकारी. सामान्य खोज के अलावा, पाएं और और IndexedDB, लेन-देन की सुविधा भी देता है. साथ ही, यह इस तरह के डेटा को सेव नहीं किया जा सकता.

हर IndexedDB डेटाबेस किसी ऑरिजिन के लिए यूनीक होता है (आम तौर पर, यह साइट डोमेन या सबडोमेन होता है). इसका मतलब है कि इसे ऐक्सेस नहीं किया जा सकता या इसे ऐक्सेस नहीं किया जा सकता किसी अन्य ऑरिजिन के लिए है. इसके डेटा स्टोरेज की सीमाएं वे आम तौर पर बड़े होते हैं, बशर्ते वे मौजूद हों, लेकिन अलग-अलग ब्राउज़र सीमाओं को संभालते हैं और डेटा हटाने की प्रोसेस अलग है. इसके लिए आगे पढ़ें सेक्शन देखें ज़्यादा जानकारी देखें.

IndexedDB शब्द

डेटाबेस
IndexedDB का सबसे ऊंचा लेवल. इसमें ऑब्जेक्ट स्टोर होते हैं, जो बदले में को शामिल नहीं किया जा सकता है. आपके पास एक से ज़्यादा डेटाबेस बनाने का विकल्प होता है आप चाहे जो भी नाम चुनें.
ऑब्जेक्ट स्टोर
डेटा स्टोर करने के लिए अलग-अलग बकेट, जो रिलेशनल डेटाबेस में टेबल की तरह काम करती है. आम तौर पर, हर टाइप के लिए एक ऑब्जेक्ट स्टोर होता है (JavaScript डेटा नहीं डेटा का प्रकार) चुनें. डेटाबेस टेबल के उलट, JavaScript डेटा ज़रूरी नहीं है कि स्टोर में अलग-अलग तरह के डेटा का एक जैसा हो. उदाहरण के लिए, अगर कोई ऐप्लिकेशन में people ऑब्जेक्ट स्टोर है, जिसमें तीन लोगों की जानकारी है लोगों की उम्र की प्रॉपर्टी 53, 'twenty-five', और unknown हो सकती है.
इंडेक्स
किसी दूसरे ऑब्जेक्ट स्टोर में डेटा को व्यवस्थित करने के लिए एक तरह का ऑब्जेक्ट स्टोर (जिसे रेफ़रंस ऑब्जेक्ट स्टोर) का डेटा). इस इंडेक्स का इस्तेमाल किया गया है का इस्तेमाल करें. उदाहरण के लिए, अगर आपको स्टोर करने से पहले, आप उन्हें बाद में उनके नाम, आयु या आपका पसंदीदा जानवर.
कार्रवाई
डेटाबेस के साथ इंटरैक्शन.
लेन-देन
किसी ऑपरेशन या ऑपरेशन के ग्रुप के चारों ओर मौजूद रैपर, जो डेटाबेस को पक्का करता है रखरखाव के लिए ज़रूरी है. अगर लेन-देन की कोई एक कार्रवाई पूरी नहीं होती, तो उनमें से कोई भी कार्रवाई पूरी नहीं होगी लागू हो जाता है और डेटाबेस उसी स्थिति में वापस आ जाता है, जैसा वह ट्रांज़ैक्शन से पहले था शुरू हुआ. IndexedDB में सभी पढ़ने या लिखने की कार्रवाइयों को लेन-देन का हिस्सा होना चाहिए. इससे समस्याओं के जोखिम के बिना, ऐटॉमिक रीड-इन-राइट ऑपरेशन को मदद मिलती है दूसरे थ्रेड एक साथ डेटाबेस पर काम करते हैं.
कर्सर
किसी डेटाबेस में मौजूद कई रिकॉर्ड पर फिर से काम करने का तरीका.

IndexedDB सहायता की जांच करने का तरीका

IndexedDB करीब-करीब दुनिया भर में काम करता है. हालांकि, अगर पुराने ब्राउज़र का इस्तेमाल किया जा रहा है, तो सुविधा का पता लगाने की सुविधा काम करती है. window को देखने का सबसे आसान तरीका है ऑब्जेक्ट:

function indexedDBStuff () {
  // Check for IndexedDB support:
  if (!('indexedDB' in window)) {
    // Can't use IndexedDB
    console.log("This browser doesn't support IndexedDB");
    return;
  } else {
    // Do IndexedDB stuff here:
    // ...
  }
}

// Run IndexedDB code:
indexedDBStuff();

डेटाबेस खोलने का तरीका

IndexedDB की मदद से, आपके पास चुने गए किसी भी नाम से कई डेटाबेस बनाने का विकल्प है. अगर आपने जब आप उसे खोलने की कोशिश करते हैं तो डेटाबेस मौजूद नहीं होता, तब वह अपने-आप बना. डेटाबेस को खोलने के लिए, idb लाइब्रेरी में मौजूद openDB() तरीके का इस्तेमाल करें:

import {openDB} from 'idb';

async function useDB () {
  // Returns a promise, which makes `idb` usable with async-await.
  const dbPromise = await openDB('example-database', version, events);
}

useDB();

इस तरीके से ऐसा प्रॉमिस मिलता है जो डेटाबेस ऑब्जेक्ट तक पहुंचता है. इसका इस्तेमाल करते समय: openDB() तरीका, सेट करने के लिए कोई नाम, वर्शन नंबर, और कोई इवेंट ऑब्जेक्ट दें डेटाबेस में रखा जा सकता है.

यहां कॉन्टेक्स्ट में openDB() तरीके का एक उदाहरण दिया गया है:

import {openDB} from 'idb';

async function useDB () {
  // Opens the first version of the 'test-db1' database.
  // If the database does not exist, it will be created.
  const dbPromise = await openDB('test-db1', 1);
}

useDB();

पहचान छिपाने वाले फ़ंक्शन के सबसे ऊपर, IndexedDB सहायता के लिए चेक को रखें. यह अगर ब्राउज़र IndexedDB के साथ काम नहीं करता है, तो फ़ंक्शन से बाहर निकल जाता है. अगर फ़ंक्शन यह कर सकता है जारी रखें, तो यह 'test-db1' नाम के डेटाबेस को खोलने के लिए, openDB() तरीके को कॉल करता है. इस उदाहरण में, चीज़ों को बनाए रखने के लिए, वैकल्पिक इवेंट ऑब्जेक्ट को छोड़ दिया गया है आसान है, लेकिन IndexedDB के साथ कोई भी काम का काम करने के लिए, आपको इसे तय करना होगा.

ऑब्जेक्ट स्टोर के साथ काम करने का तरीका

IndexedDB डेटाबेस में एक या उससे ज़्यादा ऑब्जेक्ट स्टोर होते हैं और हर एक में कॉलम, और दूसरा कॉलम उसी कुंजी से संबद्ध डेटा के लिए होता है.

ऑब्जेक्ट स्टोर बनाएं

अच्छी तरह से स्ट्रक्चर किए गए IndexedDB डेटाबेस में हर टाइप के लिए एक ऑब्जेक्ट स्टोर होना चाहिए को बनाए रखना ज़रूरी है. उदाहरण के लिए, कोई साइट जो उपयोगकर्ता बनी रहती है प्रोफ़ाइलों और नोट में, people ऑब्जेक्ट स्टोर हो सकता है, जिसमें person शामिल है ऑब्जेक्ट हैं और एक notes ऑब्जेक्ट स्टोर है, जिसमें note ऑब्जेक्ट हैं.

डेटाबेस इंटिग्रिटी पक्का करने के लिए, ऑब्जेक्ट स्टोर को सिर्फ़ openDB() कॉल में मौजूद इवेंट ऑब्जेक्ट. इवेंट ऑब्जेक्ट, upgrade() दिखाता है तरीका है जो आपको ऑब्जेक्ट स्टोर बनाने देता है. कॉल करें createObjectStore() ऑब्जेक्ट स्टोर बनाने के लिए upgrade() विधि के अंदर विधि:

import {openDB} from 'idb';

async function createStoreInDB () {
  const dbPromise = await openDB('example-database', 1, {
    upgrade (db) {
      // Creates an object store:
      db.createObjectStore('storeName', options);
    }
  });
}

createStoreInDB();

इस तरीके में ऑब्जेक्ट स्टोर का नाम और एक वैकल्पिक कॉन्फ़िगरेशन होता है ऑब्जेक्ट है, जो आपको ऑब्जेक्ट स्टोर के लिए अलग-अलग प्रॉपर्टी तय करने देता है.

यहां createObjectStore() के इस्तेमाल का उदाहरण दिया गया है:

import {openDB} from 'idb';

async function createStoreInDB () {
  const dbPromise = await openDB('test-db1', 1, {
    upgrade (db) {
      console.log('Creating a new object store...');

      // Checks if the object store exists:
      if (!db.objectStoreNames.contains('people')) {
        // If the object store does not exist, create it:
        db.createObjectStore('people');
      }
    }
  });
}

createStoreInDB();

इस उदाहरण में, इवेंट ऑब्जेक्ट को बनाने के लिए openDB() तरीके को पास किया गया है ऑब्जेक्ट स्टोर बनाने का काम पूरा हो जाता है और पहले की तरह, ऑब्जेक्ट स्टोर बनाने का काम पूरा हो जाता है इवेंट ऑब्जेक्ट की upgrade() तरीके में. हालांकि, क्योंकि ब्राउज़र किसी कोई गड़बड़ी हुई है अगर आप पहले से मौजूद ऑब्जेक्ट स्टोर बनाने की कोशिश करते हैं, तो हमारा सुझाव है कि createObjectStore() तरीके को ऐसे if स्टेटमेंट में रैप करना जो जांच करता है ऑब्जेक्ट स्टोर मौजूद है या नहीं. if ब्लॉक के अंदर, कॉल करें 'firstOS' नाम का ऑब्जेक्ट स्टोर बनाने के लिए, createObjectStore().

प्राथमिक कुंजियां कैसे तय करें

ऑब्जेक्ट स्टोर तय करते समय, यह तय किया जा सकता है कि प्राथमिक कुंजी का उपयोग करके स्टोर कर सकते हैं. आप की पाथ या की जनरेटर का इस्तेमाल करके भी ऐसा किया जा सकता है.

मुख्य पाथ ऐसी प्रॉपर्टी होती है जो हमेशा मौजूद रहती है और इसमें यूनीक वैल्यू होती है. इसके लिए उदाहरण के लिए, people ऑब्जेक्ट स्टोर के मामले में, ईमेल पता चुना जा सकता है पते को मुख्य पाथ के तौर पर चुनें:

import {openDB} from 'idb';

async function createStoreInDB () {
  const dbPromise = await openDB('test-db2', 1, {
    upgrade (db) {
      if (!db.objectStoreNames.contains('people')) {
        db.createObjectStore('people', { keyPath: 'email' });
      }
    }
  });
}

createStoreInDB();

यह उदाहरण 'people' नाम का एक ऑब्जेक्ट स्टोर बनाता है और email को असाइन करता है प्रॉपर्टी को keyPath विकल्प में प्राथमिक कुंजी के रूप में सेट करें.

आपके पास की जनरेटर का इस्तेमाल करने का भी विकल्प है, जैसे कि autoIncrement. की जनरेटर ऑब्जेक्ट स्टोर में जोड़े गए हर ऑब्जेक्ट के लिए एक यूनीक वैल्यू बनाता है. डिफ़ॉल्ट रूप से, अगर किसी पासकोड की जानकारी नहीं दी जाती है, तो IndexedDB एक कुंजी बनाता है और उसे अलग से स्टोर करता है से निकाल दिया गया है.

नीचे दिया गया उदाहरण 'notes' नाम का एक ऑब्जेक्ट स्टोर बनाता है और प्राथमिक कुंजी को स्वचालित रूप से बढ़ती हुई संख्या के रूप में असाइन किए जाने के लिए:

import {openDB} from 'idb';

async function createStoreInDB () {
  const dbPromise = await openDB('test-db2', 1, {
    upgrade (db) {
      if (!db.objectStoreNames.contains('notes')) {
        db.createObjectStore('notes', { autoIncrement: true });
      }
    }
  });
}

createStoreInDB();

नीचे दिया गया उदाहरण पिछले उदाहरण के जैसा है, लेकिन इस बार अपने-आप बढ़ने वाली वैल्यू, 'id' नाम की प्रॉपर्टी के लिए साफ़ तौर पर असाइन की जाती है.

import {openDB} from 'idb';

async function createStoreInDB () {
  const dbPromise = await openDB('test-db2', 1, {
    upgrade (db) {
      if (!db.objectStoreNames.contains('logs')) {
        db.createObjectStore('logs', { keyPath: 'id', autoIncrement: true });
      }
    }
  });
}

createStoreInDB();

कुंजी तय करने का तरीका आपके डेटा पर निर्भर करता है. अगर आपके डेटा में ऐसी प्रॉपर्टी होती है जो हमेशा यूनीक होती है, तो आप इसे keyPath बना सकते हैं, ताकि इस खासियत को लागू करें. अगर ऐसा नहीं है, तो अपने-आप बढ़ने वाली वैल्यू का इस्तेमाल करें.

यह कोड, तीन ऑब्जेक्ट स्टोर बनाता है. ये ऑब्जेक्ट स्टोर के अलग-अलग तरीकों को दिखाते हैं ऑब्जेक्ट स्टोर में मुख्य कुंजियां तय करने के लिए:

import {openDB} from 'idb';

async function createStoresInDB () {
  const dbPromise = await openDB('test-db2', 1, {
    upgrade (db) {
      if (!db.objectStoreNames.contains('people')) {
        db.createObjectStore('people', { keyPath: 'email' });
      }

      if (!db.objectStoreNames.contains('notes')) {
        db.createObjectStore('notes', { autoIncrement: true });
      }

      if (!db.objectStoreNames.contains('logs')) {
        db.createObjectStore('logs', { keyPath: 'id', autoIncrement: true });
      }
    }
  });
}

createStoresInDB();

इंडेक्स तय करने का तरीका

इंडेक्स एक तरह के ऑब्जेक्ट स्टोर होते हैं. इनका इस्तेमाल, रेफ़रंस से डेटा पाने के लिए किया जाता है किसी बताई गई प्रॉपर्टी से ऑब्जेक्ट स्टोर करें. इंडेक्स, रेफ़रंस ऑब्जेक्ट के अंदर होता है में समान डेटा रखता है और उसमें समान डेटा शामिल होता है, लेकिन वह निर्दिष्ट प्रॉपर्टी का उपयोग कुंजी का पाथ शामिल कर लें. इंडेक्स तब बनाए जाने चाहिए, जब इसकी मदद से, अपने ऑब्जेक्ट स्टोर बनाए जाते हैं. साथ ही, इसका इस्तेमाल आपके आपका डेटा.

इंडेक्स बनाने के लिए, createIndex() पर कॉल करें तरीका:

import {openDB} from 'idb';

async function createIndexInStore() {
  const dbPromise = await openDB('storeName', 1, {
    upgrade (db) {
      const objectStore = db.createObjectStore('storeName');

      objectStore.createIndex('indexName', 'property', options);
    }
  });
}

createIndexInStore();

इस तरीके से इंडेक्स ऑब्जेक्ट बनता है और नतीजे मिलता है. createIndex() तरीका चालू है ऑब्जेक्ट स्टोर का इंस्टेंस नए इंडेक्स का नाम है और दूसरा आर्ग्युमेंट डेटा की उस प्रॉपर्टी को दिखाता है जिसे इंडेक्स करें. आखिरी आर्ग्युमेंट की मदद से, दो विकल्प बताए गए हैं. इनसे यह तय होता है कि इंडेक्स काम करता है: unique और multiEntry. अगर unique को true पर सेट किया जाता है, तो इंडेक्स एक कुंजी के लिए डुप्लीकेट मानों की अनुमति नहीं देता है. इसके बाद, multiEntry यह तय करता है कि इंडेक्स की गई प्रॉपर्टी, एक अरे होने पर createIndex() कैसे काम करती है. अगर आपने इसे true पर सेट किया जाता है. createIndex(), हर अरे के लिए इंडेक्स में एक एंट्री जोड़ता है एलिमेंट. ऐसा नहीं करने पर, यह अरे वाली एक एंट्री जोड़ देता है.

यहां एक उदाहरण दिया गया है:

import {openDB} from 'idb';

async function createIndexesInStores () {
  const dbPromise = await openDB('test-db3', 1, {
    upgrade (db) {
      if (!db.objectStoreNames.contains('people')) {
        const peopleObjectStore = db.createObjectStore('people', { keyPath: