判斷objectStore物件倉庫是否存在

admin發表於2019-07-06

通過createObjectStore()方法可以建立物件倉庫,在同一個資料庫下,倉庫名稱必須是唯一的。

如果建立同名物件倉庫,則會報錯,下面通過一段簡單程式碼例項進行演示:

[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;
  let objectStore = db.createObjectStore("students",{ keyPath: 'id' });
  objectStore.createIndex('studentName', "name", { unique: false });
}
</script>
</head>
<body>
</body>
</html>

通過上面程式碼可以建立一個名為antzone的資料庫,然後在其中新增名為students物件倉庫。

為了查詢方便,最後通過objectStore.createIndex方法建立索引。

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

a:3:{s:3:\"pic\";s:43:\"portal/201907/06/012526m8vv5tpjt8ou3jop.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

此時要修改一下資料庫結構,那麼必須要將資料庫版本提升,以此觸發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", 2);
request.onupgradeneeded  = (ev) => {
  let db = ev.target.result;
  let objectStore = db.createObjectStore("students",{ keyPath: 'id' });
  objectStore.createIndex('studentName', "name", { unique: false });
}
</script>
</head>
<body>
</body>
</html>

將資料庫的版本修改為2,那麼會觸發upgradeneeded,再次建立同名物件倉庫。

谷歌開發者工具控制檯報錯如下:

a:3:{s:3:\"pic\";s:43:\"portal/201907/06/012606rayq7arozfn3nhhh.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

所以需要判斷一下是否已經存在同名物件倉庫,程式碼修改如下:

[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", 2);
request.onupgradeneeded  = (ev) => {
  let db = ev.target.result;
  if (!db.objectStoreNames.contains('students')) {
    let objectStore = db.createObjectStore("students",{ keyPath: 'id' });
    objectStore.createIndex('studentName', "name", { unique: false });
  }
}
</script>
</head>
<body>
</body>
</html>

上面程式碼完成了判斷功能,資料庫物件的objectStoreNames屬性可以返回所有的物件倉庫名稱。

返回值型別是DOMStringList 物件(字串的集合),contains方法可以檢測物件倉庫名稱是否已經存在。

相關閱讀:

(1).建立物件倉庫參閱createObjectStore()方法一章節。

(2).建立資料庫參閱indexedDB.open()方法一章節。

(3).建立索引參閱createIndex()方法一章節。

相關文章