IndexedDB upgradeneeded 事件

admin發表於2019-09-22

upgradeneeded事件會在資料庫新建或者升級資料庫版本的時候觸發。

從事件名稱也可以窺探出它的觸發時機,可以認為資料庫新建是版本從無到有的升級。

關於事件處理函式註冊,可以參閱如何註冊事件處理函式一章節。

程式碼例項如下:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<script>
let request = window.indexedDB.open("antzone", 1);

request.onupgradeneeded = (ev) => {
  let db = ev.target.result;
  if (!db.objectStoreNames.contains('students')) {
    let objectStore = db.createObjectStore('students',{keyPath:"id"});
    objectStore.createIndex("xingbie","sex",{ unique: false });
  }
}
</script>
</head>
<body>
  <p>upgradeneeded演示</p>
</body>
</html>

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201909/22/231043ffhft2i93t5ielh8.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

對上述程式碼分析如下:

(1).如果沒有名稱為"antzone"的資料庫,則會通過indexedDB.open()方法建立。

(2).新建立資料庫會觸發upgradeneeded事件。

(3).事件出發後會執行事件處理函式中的程式碼,建立對應資料庫,並進行一些列的配置。

(4).如果要升級資料庫版本,比如將當前版本1修改為更高的版本2,也會觸發upgradeneeded事件。

強調:對於資料庫的結構性修改,比如新增或者刪除物件倉庫等操作需要在此事件中進行。

IndexedDB資料庫建立或者資料增刪改查等操作需要藉助於事務,但好像上述程式碼並沒有涉及事務。

事實並非如此,upgradeneeded事件觸發時候,會自動建立一個事務,並且事務的模式被賦值為verionchange。

下面通過程式碼例項進行一下演示,升級一下資料庫版本到3,以便觸發事件。

[HTML] 純文字檢視 複製程式碼執行程式碼
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<script>
let request = window.indexedDB.open("antzone", 3);

request.onupgradeneeded = (ev) => {
  let db = ev.target.result;
  if (!db.objectStoreNames.contains('students')) {
    let objectStore = db.createObjectStore('students',{keyPath:"id"});
    objectStore.createIndex("xingbie","sex",{ unique: false });
  }
  console.log(ev.target.transaction)
}
</script>
</head>
<body>
  <p>upgradeneeded演示</p>
</body>
</html>

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201909/22/231109dvv8fenfr1reojyj.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

事務很明顯是存在的,只不過此事務不能人為建立。

相關文章