Ankündigung

Einklappen
Keine Ankündigung bisher.

indexed DB selektieren und updaten unkompliziert?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • indexed DB selektieren und updaten unkompliziert?

    Hallo Forum,

    ich beschäftige mich zur Zeit mit der indexedDB (WebSQL wäre mir lieber gewesen *g), nach einwenig googeln und bisher einem wirklich hilfreichen Blog konnte ich die ersten Schritte machen...
    Da die Funktionsweise durch aus bissl umständlich ist habe ich angefangen mir wrapper zu bauen (js.db funktionierte leider nicht wirklich).

    Code:
    /** [-Indexed-DB-] */
    idb = function(db, v, tables, onReady){
        var that = this;
        this.db;
    
        this.insert = function(table, data, callback){
            var store = that.db.transaction(table, 'readwrite').objectStore(table);
            var request = store.put(data);
                request.onsuccess = callback;
        };
        this.select = function(table, mode, range, callback){
            // var trans = that.db.transaction(table, 'readonly');
            var store = that.db.transaction(table, 'readonly').objectStore(table);
    
            switch( mode ){
                case 'of': range = IDBKeyRange.lowerBound(range); break; // alle Einträge ab Position x
                case 'to': range = IDBKeyRange.upperBound(range); break; // alles bis Eintrag X
                case 'bt': range = IDBKeyRange.only(range[0], range[1]); break; // von x bis x
                case 'id': range = IDBKeyRange.only(range); break; // nur diese ID/diesen key
            }
    
            var cursorRequest = store.openCursor(range);
            cursorRequest.onsuccess = function(evt){
                // console.log('succes', evt);
                var result = evt.target.result;
                if( result ){
                    callback(result.value);
                    result.continue();
                }
            };
        }
    
        // create database
        var newDB = indexedDB.open(db, v);
        newDB.onupgradeneeded = function(){
            console.log('Datenbank angelegt');
            that.db = this.result;
            for( var table in tables ){
                var tableData = tables[table];
    
                if( !that.db.objectStoreNames.contains(table) ){
                    var newTable = that.db.createObjectStore(table, tableData.shift());
    
                    // add indexes if exist
                    tableData.forEach(function(index){
                        newTable.createIndex(index.shift(), index.shift(), index.shift());
                    });
                }
            }
        };
        newDB.onsuccess = function(){
            console.log('Datenbank geöffnet');
            that.db = this.result;
            onReady();
        };
    }
    
    var tables = {
        foo: [
            {keyPath: 'id', autoIncrement: false, unique: true},
            // ['col1', 'col1', { unique: true }] // index hinzufügen
            // ['col2', 'col2', { unique: true }] // index hinzufügen
        ]
    };
    var db = new idb('test', 1, tables, function(){
        console.log('test DB is ready');
        // db.insert('foo', {id: 'set1', text: 'Datensatz nummer #2'}, function(e){
        //     console.log('datensatz 1 eingetragen', e)
        // });
        // db.insert('foo', {id: 'set2', text: 'Datensatz nummer #3'}, function(e){
        //     console.log('datensatz 2 eingetragen', e)
        // });
    
        db.select('foo', 'id', 'set1', function(e){
            console.log('datensatz', e)
        });
    });
    Funktioniert bis her ganz gut, Tabellen können recht einfach erstellt werden und auch gleich mit indexes versehen werden.
    Das eintragen der Datensätze klappt ebenfalls und auch das auslesen.

    Mit diesem Code habe ich mal das "Updaten" einwenig ausprobiert und ich wollte wissen wie es so funktioniert wenn ich nur den Datensatz einer bestimmten ID haben möchte.

    Nun mal zu ein par Fragen:
    1) Muss ich immer den ganzen Datensatz neu speichern oder kann man ähnlich wie in SQL auch nur eine einzelne oder festgelegte Spalten mit neuem Inhalt füllen (wie?) ?

    2) Mit der Range-Möglichkeit kann ich sofern die id == keyPath ist anhand einer ID selektieren aber auch hier stellt sich mir die Frage wie sieht es mit verschiedenen indexes aus?
    Also auch wieder wie bei SQL, das ich nach Spalten Inhalt selektieren kann (mit range dürfte wenn ich mich nicht irre ja immer nur die eine definierte spalte eine Rolle spielen aber man kann ja indexes hinzufügen).

    3) Datensätze löschen fehlt mir noch gänzlich.


    Es gibt hier bei w3.org zwar eine Übersicht, aber ich finds a bissl argh unübersichtlich und leider nur selten Code-schnippsel.

    MfG: Paykoman
    PS: Kleine Codeschnippsel gerade für die Syntax und Funktionsnamen wären sehr willkommen!

  • #2
    ich bin über dexie.js gestolpert, kann man sich den Code auf Github ansehen.

    Kommentar


    • #3
      Hmm ok, interessant. Aber leider ziemlich dick mit 207 KB in 4400+ Zeilen xD

      Kommentar


      • #4
        Ich benutze bereit Erfolgreich in mehreren Projekten LokiJs (http://lokijs.org). Dies ist eine Memory Datenbank für NodeJS/Browser welche eine fast komplett kompatible Query Syntax zu MongoDB besitzt. Über PersistensAdapter können die Daten dann auch persistiert werden z.B. mit IndexDB oder LocalStorage etc.

        Kannst dir ja mal anschauen, ich bin soweit ganz begeistert davon.

        Edit: Die minified Version ist 21,6 KB groß.

        Kommentar


        • #5
          Auf developer.mozilla findest eine bessere Übersicht über IndexedDB, auch mit vielen Code Beispielen (unter anderem zum löschen von Datensätzen):
          https://developer.mozilla.org/en-US/...sing_IndexedDB

          Kommentar


          • #6
            Zitat von Paykoman Beitrag anzeigen
            Hmm ok, interessant. Aber leider ziemlich dick mit 207 KB in 4400+ Zeilen xD
            Wohw,
            ( only ~18k minified and gzipped )
            mir ging es eher darum, Lösungsansätze zu zeigen...

            Kommentar

            Lädt...
            X