IndexedDB 数据库遍历
const readTableData = async (TableName) => {
try {
const db = await openDB(DB_NAME, DB_VERSION);
console.log(db,"db")
const tx = db.transaction(TableName, 'readonly');
const store = tx.objectStore(TableName);
const items = await store.getAll();
console.log(`${TableName}的数据:`, items);
return items;
} catch (error) {
console.error(`读取${TableName}数据时出错:`, error);
return [];
}
};
const readAllDBData = async () => {
try {
const db = await openDB(DB_NAME, DB_VERSION);
const tableNames = await db.objectStoreNames;
for (const v of tableNames) {
const items = await readTableData(v);
console.log(`${v}的数据:`, items);
}
return null;
} catch (error) {
console.error(`读取数据时出错:`, error);
return [];
}
};
完整React代码
import React, { useState } from 'react';
import { openDB } from 'idb';
const DB_NAME = 'yourDBName';
const DB_VERSION = 1;
function App() {
const [data, setData] = useState([]);
const readTableData = async (TableName) => {
try {
const db = await openDB(DB_NAME, DB_VERSION);
console.log(db, "db");
const tx = db.transaction(TableName, 'readonly');
const store = tx.objectStore(TableName);
const items = await store.getAll();
console.log(`${TableName}的数据:`, items);
return items;
} catch (error) {
console.error(`读取${TableName}数据时出错:`, error);
return [];
}
};
const readAllDBData = async () => {
try {
const db = await openDB(DB_NAME, DB_VERSION);
const tableNames = Array.from(db.objectStoreNames);
const allData = [];
for (const tableName of tableNames) {
const items = await readTableData(tableName);
allData.push({ tableName, items });
console.log(`${tableName}的数据:`, items);
}
setData(allData);
} catch (error) {
console.error('读取数据时出错:', error);
}
};
return (
<div>
<h1>数据库数据读取</h1>
<button onClick={readAllDBData}>读取所有数据</button>
<div>
{data.length > 0 && (
<div>
<h2>读取的所有数据:</h2>
<ul>
{data.map((tableData, index) => (
<li key={index}>
<h3>{tableData.tableName}</h3>
<pre>{JSON.stringify(tableData.items, null, 2)}</pre>
</li>
))}
</ul>
</div>
)}
</div>
</div>
);
}
export default App;
实现对数据库的复制与更新
import React, { useState } from 'react';
import { openDB } from 'idb';
const DB_NAME = '**';
const DB_VERSION = 2;
const NEW_DB_NAME = '***';
const NEW_DB_VERSION = 3;
function App() {
const [data, setData] = useState([]);
const copyDatabaseStructure = async (sourceDBName, targetDBName, dbVersion) => {
try {
const sourceDB = await openDB(DB_NAME, DB_VERSION);
const targetDB = await openDB(targetDBName, dbVersion, {
upgrade(db) {
const sourceTableNames = Array.from(sourceDB.objectStoreNames);
sourceTableNames.forEach((tableName) => {
const store = sourceDB.transaction(tableName, 'readonly').objectStore(tableName);
const newStore = db.createObjectStore(tableName, {
keyPath: store.keyPath,
});
});
},
});
console.log(`成功复制数据库结构: ${sourceDBName} -> ${targetDBName}`);
} catch (error) {
console.error('复制数据库结构时出错:', error);
}
};
const readTableData = async (TableName,index) => {
try {
const db = await openDB(DB_NAME, DB_VERSION);
console.log(db, "db");
const tx = db.transaction(TableName, 'readonly');
const store = tx.objectStore(TableName);
const items = await store.getAll();
console.log(`${TableName}的数据:`, items);
const newDB = await openDB(NEW_DB_NAME, NEW_DB_VERSION);
const newtx = newDB.transaction(TableName, 'readwrite');
const newstore = newtx.objectStore(TableName);
let newindex = 0 ;
items.forEach(item => {
const { id, ...Item } = item;
const newItem = { ...item, id: newindex };
newindex = newindex + 1
newstore.put(newItem);
});
await tx.done;
console.log(`数据成功插入到${NEW_DB_NAME}中的${TableName}表格`);
return items;
} catch (error) {
console.error(`读取${TableName}数据时出错:`, error);
return [];
}
};
const readAllDBData = async () => {
copyDatabaseStructure(DB_NAME, NEW_DB_NAME, NEW_DB_VERSION);
try {
const db = await openDB(DB_NAME, DB_VERSION);
const tableNames = Array.from(db.objectStoreNames);
const allData = [];
for (const [index, tableName] of tableNames.entries()) {
const items = await readTableData(tableName,index);
allData.push({ tableName, items });
console.log(`第${index + 1}个`, `${tableName}的数据:`, items);
}
setData(allData);
} catch (error) {
console.error('读取数据时出错:', error);
}
};
return (
<div>
<h1>数据库数据读取</h1>
<button onClick={readAllDBData}>读取所有数据</button>
<div>
{data.length > 0 && (
<div>
<h2>读取的所有数据:</h2>
<ul>
{data.map((tableData, index) => (
<li key={index}>
<h3>{tableData.tableName}</h3>
<pre>{JSON.stringify(tableData.items, null, 2)}</pre>
</li>
))}
</ul>
</div>
)}
</div>
</div>
);
}
export default App;
CG