indexedDB добавить запись в objectStore работает только один раз - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь понять, как работает indexedDB, и написал довольно простой трекер посетителей сайта. Это работает в первый раз. Когда страница загружается в первый раз, все работает как положено. Я вижу, что данные добавлены в мой objectStore.

Теперь каждый раз, когда я обновляю страницу, я не получаю новую запись, как ожидалось. Что я не правильно делаю? Любое руководство или помощь приветствуются.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">

  <!-- The above 3 meta tags *must* come first in the head; any other 
  head content must come *after* these tags -->

  <meta name="description" content="">
  <meta name="author" content="">

  <script language="JavaScript" src="http://www.geoplugin.net
  /javascript.gp" type="text/javascript"></script>

</head>
<body>
  // UI here
</body>
<script>
  var timeDate = new Date();
  var tD=timeDate.toString();
  alert(timeDate);          

  var ip = geoplugin_request();           // get client ip
  alert(ip);

  var city = geoplugin_city();            // get client city
  alert(city);

  var country = geoplugin_countryName() ; // get client country
  alert(country);

  var os = navigator.oscpu;               // get platform info
  alert(os);

  window.indexedDB = window.indexedDB || window.mozIndexedDB || 
  window.webkitIndexedDB || window.msIndexedDB;

  //prefixes of window.IDB objects
  window.IDBTransaction = window.IDBTransaction || 
  window.webkitIDBTransaction || window.msIDBTransaction;
  window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || 
  window.msIDBKeyRange

  if (!window.indexedDB) {
    window.alert("Your browser doesn't support a stable version of IndexedDB.")
  }

  var visitorInfo = [{ 
         date   : tD, 
         ip     : ip, 
         city   : city, 
         country: country,
         os     :os },            
     ];

     var db;
     var request = window.indexedDB.open("visitor", 1);

     request.onerror = function(event) {
        console.log("error: ");
     };

     request.onsuccess = function(event) {
        db = request.result;
        console.log("success: "+ db);
     };

     request.onupgradeneeded = function(event) {
        var db = event.target.result;

        if(!db.objectStoreNames.contains("userinfo")){
            console.log("creating userinfo table..");
            //var objectStore = db.createObjectStore("userinfo", {keyPath: "ip",autoIncrement:true});            
            var objectStore = db.createObjectStore("userinfo", {keyPath: "ip"});            
        }
        else{
            console.log("userinfo exists");
            }

        for (var i in visitorInfo) {
           objectStore.add(visitorInfo[i]);
        }
     }

1 Ответ

0 голосов
/ 04 сентября 2018

Код, который вставляет объекты, находится в обработчике onupgradeneeded. Функция обработчика onupgradeneeded выполняется только при первом создании базы данных или увеличении версии.

С другой стороны, обработчик успеха для вызова indexedDB.open запускается каждый раз, когда база данных создается, обновляется или просто открывается.

Следовательно, вы хотите переместить код, который вставляет объекты из обработчика onupgradeneeded в обработчик успеха.

...