1.Storage
2.webSQL 數據庫操作
3.Indexeddb 數據庫操作
在HTML5本地存儲中,Web SQL Database實際上已經被廢棄,而HTML5的支持的本地存儲實際上變成了Web Storage(Local Storage和Session Storage)與IndexedDB。Web Storage使用簡單字符串鍵值對在本地存儲數據,方便靈活,但是對於大量結構化數據存儲力不從心,IndexedDB是爲了能夠在客戶端存儲大量的結構化數據,並且使用索引高效檢索的API。
Storage
setItem(key,value);
getItem(key);
1.sessionStorage:只在不關閉瀏覽器的情況下 數據有效,只要關閉掉瀏覽器就會 清除保存的數據
2.localStorage:只要不清楚緩存 保存到瀏覽器的數據 一直存在
indexedDB
indexedDB是一個nosql ,都是以對象的方式區存儲
indexedDB的基本操作
1. 打開數據庫並且開始一個事務。(事務 一個平臺 演員的舞臺 是一個可以提供表演的地方)
2. 創建一個 object store。
3. 構建一個請求來執行一些數據庫操作,像增加或提取數據等。
4. 通過監聽正確類型的 DOM 事件以等待操作完成。
5. 在操作結果上進行一些操作(可以在 request 對象中找到
使用流程:(1.打開數據庫2.建表3.增刪改查)
1. 判斷瀏覽器 是不是 支持 indexedDB
indexedDB?alert(“支持indexedDB”):alert(“不支持indexedDB”);
2.打開/創建數據庫
indexedDB.open(“數據庫的名字”); -> IDBOpenDBRequest
IDBOpenDBRequest:
監聽事件:
onerror:創建或者 打開數據庫 失敗的時候 調用
onsuccess:創建或者 打開數據庫成功 的時候 調用
Onupgradeneeded:只在數據庫的版本號 被更新的時候調用
3.創建類似於BMOB裏面 的某個表(也可以想象爲是一個數據模型)
通過ObjectStore進行操作(增刪改查建表)
1.建表(創建類)數據庫的對象.createObjectStore(“表名字”,設置唯一字段(設置這個類裏面 可以找到某一個對象的屬性));
2.創建字段(給創建的類 添加屬性)ObjectStore的對象.createIndex(“屬性名”,”key“);
4.增刪改查的操作
objectStore.add() 增
objectStore.delete()刪
objectStore.put()改
objectStore.get()查
代碼示例:
1. 打開數據庫
function openDB() {
var request = indexedDB.open("noteDB",1);
request.onerror = function (errror) {
console.log(errror);
};
request.onsuccess = function () {
console.log("打開數據庫成功");
};
//只在數據庫版本號 兩次不一致的情況下 調用
request.onupgradeneeded = function () {
console.log("更新數據庫成功",this);
};
}
2.建表
從沒有數據庫到有數據庫、數據庫的版本號更新的時候 再去建表。
查詢 數據庫中 是不是存在 同樣的表 如果存在 也別創建了
onupgradeneeded 可以監聽數據庫版本號的變更
可以通過IDBDataBase裏面的objectStoreNames 查看數據庫裏面 都創建了 哪些表名
var tableName = "note";
// 可以通過objectStoreNames獲取到 已經建好表的名字
if (!db.objectStoreNames.contains(tableName)){
// 建表
var objectStore = db.createObjectStore(tableName);
// 創建表裏面的字段
// 創建字段的時候 需要 至少傳入兩個參數
// 1.字段的名字 2.可以通過哪個名字 查找到 這個字段對應的內容
objectStore.createIndex("title","title");
objectStore.createIndex("content","content");
objectStore.createIndex("date","date");
}
- 增刪改查的操作
1)db -> transaction()-> 事務的對象2)事務的對象-> objectStore3)objectStore -> 增刪改查
添加數據
functionaddData(info) {
returnobjectStore.add(info);
}
查詢數據GetgetAll functionsearchAll() {
returndatabase.transaction([“note”],”readonly”).objectStore(“note”).getAll();
}
會得到一個IDBRequest對象,可以通過監聽成功事件 獲得到查詢到的數據searchAll().onsuccess=function() {
console.log(this.result);
};
如果查詢單個key對應的數據可以通過get(key)database.transaction([“note”],”readonly”).objectStore(“note”).get(1502242969880).onsuccess=function() {
console.log(this);
};
刪除數據
.delete(1502242969880).onsuccess=function() {
console.log(this);
};
更新數據
. put({title:”更新數據”,content:”更據”,date:1502183031380}).onsuccess=function() {
console.log(this);
};
需要注意的事項:任何數據庫的操作 更新字段、表需要先清除原來的數據庫如果是查找、刪除、修改具體的內容的時候需要根據一個唯一值查找
//添加數據
function addData(info) {
//獲得到事務的對象
var transaction = database.transaction(["note"],"readwrite");
//存放某一種類型數據的容器(類似類)
var objectStore = transaction.objectStore("note");
// 執行增刪改查的操作
return objectStore.add(info);
}
//查詢數據的方法
function searchAll(){
return database.transaction(["note"],"readonly").objectStore("note").getAll();
}
//get查詢方法
function search(){
database.transaction(["note"],"readonly").objectStore("note").get(1502194444741).onsuccess=function(){
console.log(this);
}
}
//刪除的方法
function deleteData(){
database.transaction(["note"],"readwrite").objectStore("note").delete(1502194444741).onsuccess=function(){
console.log(this.result);
}
}
//更新的方法
function update(){
database.transaction(["note"],"readwrite").objectStore("note").put({title:"更新的數據",content:"更新的數據",date:1502183031380}).onsuccess=function(){
console.log(this);
}
}
完整js代碼
(function(){
//聲明數據庫對象
var database = null;
//創建 打開數據庫DB(database)
function openDB(){
var request = indexedDB.open("noteDB",7); // 創建 一個數據庫 後面的數子代表數據庫的版本號 沒刷新一次 版本號就要更新一次 不然在第二次跟新的是很好就不會打印17行的this
request.onerror = function(error){ //打開失敗的方法
console.log(error)
};
request.onsuccess = function(){ //打開成功
console.log("打開數據庫成功")
database = this.result;
//console.log(searchAll())
searchAll().onsuccess = function(){
console.log(this.result)
}
//調用get查詢方法
search()
//刪除方法
deleteData()
//更新方法
update()
};
//只在 數據庫版本號 兩次不一致的情況下 調用 再次調用不執行
request.onupgradeneeded = function(){ //刷新數據庫
//再見表的時候 不需要每次都去建表,可以在數據庫更新版本號上午時候去創建版本號
console.log("打開數據庫成功",this);
//獲取數據庫對象
var db = this.result;
//可以同objectStoreNames獲取到已建好表的名字
var tableName = "note";
if(!db.objectStoreNames.contains(tableName)){
//console.log("可以建表了");
//創建表 keyPath既可以接受當前類的屬性 也可以接受關係類的屬性
var objectStore = db.createObjectStore(tableName,{keyPath:"date"});
//創建表裏面的字段
//創建字段的時候 需要至少傳入兩個參數
//1.字段的名字 2.可以通過那個名字 查找到相應的字段內容
objectStore.createIndex("title","title");
objectStore.createIndex("content","content");
objectStore.createIndex("date","date")
}
};
}
//添加數據方法
function addData(info){
//獲得到事物的對象 傳連個參數 第一個是一個note數組 第二個是 讀取方式爲讀寫
//注意這裏一個有三種讀寫數據的方式 readwrite(讀寫)readonly(只讀) versionchange()
var transaction=database.transaction(["note"],"readwrite")
//存放某一隻類型數據的容器(類似類)
var objectStore = transaction.objectStore("note");
//執行增刪改查的操作
console.log(objectStore.add(info))
}
//查詢數據的方法
function searchAll(){
return database.transaction(["note"],"readonly").objectStore("note").getAll();
}
//get查詢方法
function search(){
database.transaction(["note"],"readonly").objectStore("note").get(1502194444741).onsuccess=function(){
console.log(this);
}
}
//刪除的方法
function deleteData(){
database.transaction(["note"],"readwrite").objectStore("note").delete(1502194444741).onsuccess=function(){
console.log(this.result);
}
}
//更新的方法
function update(){
database.transaction(["note"],"readwrite").objectStore("note").put({title:"更新的數據",content:"更新的數據",date:1502183031380}).onsuccess=function(){
console.log(this);
}
}
//獲取html中的標籤 並賦予點擊事件
function loadView(){
var titleInput = document.querySelector(".addNoteView input");
var contentInput = document.querySelector(".addNoteView textarea");
var saveButton = document.querySelector(".addButton");
saveButton.οnclick=function(){
var title = titleInput.value;
var content = contentInput.value;
var timeStamp = new Date().getTime();
//把頁面輸入的信息數據一addData()傳到數據庫中
addData({
title:title,
content:content,
date:timeStamp
})
}
}
//瀏覽器是否支持
function init(){
if(!indexedDB){ //判斷 當沒有這個數據庫的時候 跳出函數
return;
}
openDB(); //在有這個數據庫的是很好 調用函數打開數據庫
loadView(); //調用函數引入頁面中的數據 傳到數據庫
}
init()
})()