如何将json文件导入indexeddb?

时间:2015-07-29 14:28:14

标签: json indexeddb

我正在做一个在IndexedDB中存储一些数据的应用程序,但我想先加载一些json文件中的数据。

这是我的json文件:

{
  "ciudades":[
    {
      "ciudad":"Asuncion",
      "latitud":-25.2985296,
      "longitud":-57.6710677
    },
    {
      "ciudad":"Caaguazu",
      "latitud":-25.465034,
      "longitud":-56.0183859
    },
    {
      "ciudad":"Ciudad del Este",
      "latitud":-25.4933441,
      "longitud":-54.6710438
    },
     {
      "ciudad":"San Pedro",
      "latitud":-24.1586759,
      "longitud":-56.636503
    },
     {
      "ciudad":"Pedro Juan Caballero",
      "latitud":-22.5450875,
      "longitud":-55.7618963
    }
 ]
}

3 个答案:

答案 0 :(得分:3)

你按照步骤

第1步read mozilla site

第2步创建indexedDB

var ciudades = [
{
  "ciudad":"Asuncion",
  "latitud":-25.2985296,
  "longitud":-57.6710677
},
{
  "ciudad":"Caaguazu",
  "latitud":-25.465034,
  "longitud":-56.0183859
},
{
  "ciudad":"Ciudad del Este",
  "latitud":-25.4933441,
  "longitud":-54.6710438
},
 {
  "ciudad":"San Pedro",
  "latitud":-24.1586759,
  "longitud":-56.636503
},
 {
  "ciudad":"Pedro Juan Caballero",
  "latitud":-22.5450875,
  "longitud":-55.7618963
}
];

var IDBSetting = {
    name: "indexedDBName",
    version: 1,
    tables: [{
        tableName: "ciudades",
        keyPath: "seq",
        autoIncrement: true,
        index: ["ciudad", "latitud", "longitud],
        unique: [false, false, false]
    }]
};

! function() {
    console.log("indexeDB init");

    var req = indexedDB.open(IDBSetting.name, IDBSetting.version);

    req.onsuccess = function(event) {
        console.log("indexedDB open success");
    };

    req.onerror = function(event) {
        console.log("indexed DB open fail");
    };

    //callback run init or versionUp
    req.onupgradeneeded = function(event) {
        console.log("init onupgradeneeded indexedDB ");
        var db = event.target.result;

        for (var i in IDBSetting.tables) {
            var OS = db.createObjectStore(IDBSetting.tables[i].tableName, {
                keyPath: IDBSetting.tables[i].keyPath,
                autoIncrement: IDBSetting.tables[i].autoIncrement
            });

            for (var j in IDBSetting.tables[i].index) {
                OS.createIndex(IDBSetting.tables[i].index[j], IDBSetting.tables[i].index[j], {
                    unique: IDBSetting.tables[i].unique[j]
                });
            }
        }
    }
}();

第3步addData

var IDBFuncSet = {
    //write
    addData: function(table, data) {
        var req = indexedDB.open(IDBSetting.name, IDBSetting.version);

        req.onsuccess = function(event) {
            try {
                console.log("addData indexedDB open success");
                var db = req.result;
                var transaction = db.transaction([table], "readwrite");
                var objectStore = transaction.objectStore(table);
                var objectStoreRequest = objectStore.add(data);
            } catch (e) {
                console.log("addDataFunction table or data null error");
                console.log(e);
            }

            objectStoreRequest.onsuccess = function(event) {
                //console.log("Call data Insert success");
            }
            objectStoreRequest.onerror = function(event) {
                console.log("addData error");
            }
        };

        req.onerror = function(event) {
            console.log("addData indexed DB open fail");
        };
    }
}

for(var i in ciudades){
   IDBFuncSet.addData("ciudades",ciudades[i]);
}

第4步getData

IDBFuncSet.getAllData = function(arr, table) {
    try {
        var req = indexedDB.open(IDBSetting.name, IDBSetting.version);

        req.onsuccess = function(event) {
            var db = req.result;
            var transaction = db.transaction([table], "readonly");
            var objectStore = transaction.objectStore(table);

            var objectStoreRequest = objectStore.openCursor();

            objectStoreRequest.onsuccess = function(event) {
                var cursor = event.target.result;
                if (cursor) {
                    arr.push(cursor.value);
                    cursor.continue();
                } else {

                }
            }
        };
        req.onerror = function(event) {
            console.log("getAllData indexed DB open fail");
        };
    } catch (e) {
        console.log(e);
    }
}
var ciudadesArr = [];
IDBFuncSet.getAllData(ciudadesArr, "ciudades");

console.log(ciudadesArr);

我希望这会有所帮助

答案 1 :(得分:1)

File API,但这似乎不是一个可靠的标准。

我目前所做的是让用户打开文件,将其内容复制到剪贴板,然后将其粘贴到我网页上的TextArea元素中。

在JavaScript中,我向TextArea的change事件添加一个监听器,并将文本内容解析为JSON,然后将其写入indexedDB。

答案 2 :(得分:1)

以下是我如何完成我的thanks to the android-indexeddb套餐。

max speed

然后在我的控制器中:

angular.module('yourApp', ['indexedDB'])
    .config(function($indexedDBProvider) {
        $indexedDBProvider
            .connection('dbName')
            .upgradeDatabase(1, function(event, db, tx) {
                var objStore = db.createObjectStore('storeOne', { keyPath: 'stop_id' });
                objStore.createIndex('store_id', 'store_id', { unique: false });
            })
            // the next upgradeDatabase() function is necessary if you 
            // wish to create another datastore
            .upgradeDatabase(2, function(event, db, tx) {
                var secondObjectStore = db.createObjectStore('storeTwo', { keyPath: 'my_id' });
                secondObjectStore.createIndex('another_id', 'another_id', { unique: false });
            });
    })

查看项目页面,了解更多关于这个包裹的技巧。

虽然这个angular-indexeddb页面支持查询,但对于像连接这样的高级查询,你可能想要consider ydn-db

使用两个软件包获得一些非常好的工作流程。

对于loadJSON()函数,它可能是这样的:

angular.module('yourApp')
    .controller('homeCtrl', ['$scope', '$http', '$indexedDB', function($scope, $http, $indexedDB) {
        $scope.objects = [];
        var loadJSON = function(file_name) { ... //load the json file in here}

        $indexedDB.openStore('storeOne', function(store) {
            var loaded = loadJSON('file_name.json');
            store.upsert(loaded).then(function(e) {
                console.log('added successfully');
            });
        });        

        $indexedDB.openStore('times', function(store) {
            var loaded = loadJSON('file_name.json');
            store.upsert(loaded).then(function(e) {
                console.log('added successfully');
            });
        });
    }]);