IndexedDBのget(), add(), count()のサンプル
<h1>IndexedDBのget(), add(), count()のサンプル</h1>
<div>
<input type="text" id="userName" value=""> <button id="addUserBtn">ユーザー追加</button>
<hr>
<input type="number" id="userId" value="" min="1"> <button id="userIdBtn">ユーザーID検索</button>
<p id="result"></p>
</div>
const DB_NAME = 'UserDatabase'
const STORE_NAME = 'users'
const request = indexedDB.open(DB_NAME)
request.onsuccess = (event) => {
const db = event.target.result
const transaction = db.transaction(STORE_NAME, 'readonly')
const store = transaction.objectStore(STORE_NAME)
const countRequest = store.count()
countRequest.onsuccess = () => {
const userName = document.getElementById('userName')
const addUserBtn = document.getElementById('addUserBtn')
const userId = document.getElementById('userId')
const userIdBtn = document.getElementById('userIdBtn')
const result = document.getElementById('result')
let id = countRequest.result
addUserBtn.addEventListener('click', () => {
if (!userName.value) return
addUser(db, { id: ++id, name: userName.value })
userName.value = ''
})
userIdBtn.addEventListener('click', () => {
if (!userId.value) return
getUser(db, parseInt(userId.value))
})
}
}
request.onupgradeneeded = (event) => {
const db = event.target.result
if (!db.objectStoreNames.contains(STORE_NAME)) {
const objectStore = db.createObjectStore(STORE_NAME, { keyPath: 'id' })
objectStore.createIndex('name', 'name', { unique: false })
objectStore.createIndex('age', 'age', { unique: false })
console.log('オブジェクトストアが作成されました')
}
}
function addUser(db, user) {
const transaction = db.transaction(STORE_NAME, 'readwrite')
const store = transaction.objectStore(STORE_NAME)
const getRequest = store.get(user.id)
getRequest.onsuccess = () => {
if (getRequest.result) {
console.log('同じIDのユーザーがすでに存在します:', getRequest.result)
} else {
const addRequest = store.add(user)
addRequest.onsuccess = () => {
console.log('ユーザーが追加されました:', user)
}
}
}
}
function getUser(db, id) {
const transaction = db.transaction(STORE_NAME, 'readonly')
const store = transaction.objectStore(STORE_NAME)
const request = store.get(id)
const result = document.getElementById('result')
request.onsuccess = () => {
result.textContent = request.result?.name ?? `id: ${id} のユーザーは存在しません`
}
}
元記事を表示する