WebKit提供了多种机制来支持Web数据库和本地存储,这些功能允许网站和Web应用程序在用户的设备上存储数据。以下是WebKit中Web数据库和本地存储的工作原理,以及相关的示例代码。
Web数据库(Web SQL Database)
Web SQL Database是一个现在已经废弃的API,它允许网站创建和操作SQLite数据库。尽管它不再被推荐使用,但它曾经是存储大量结构化数据的一种方式。
-
创建数据库:
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
-
创建表:
db.transaction(function(tx) {tx.executeSql('CREATE TABLE IF NOT EXISTS logs(id INTEGER PRIMARY KEY ASC, log TEXT)'); });
-
插入数据:
db.transaction(function(tx) {tx.executeSql('INSERT INTO logs (log) VALUES (?)', ['Log entry here']); });
-
查询数据:
db.transaction(function(tx) {tx.executeSql('SELECT * FROM logs', [], function(tx, resultSet) {for (var i = 0; i < resultSet.rows.length; i++) {console.log(resultSet.rows.item(i).id + ' : ' + resultSet.rows.item(i).log);}}); });
-
更新数据:
db.transaction(function(tx) {tx.executeSql('UPDATE logs SET log = ? WHERE id = ?', ['Updated log', 1]); });
-
删除数据:
db.transaction(function(tx) {tx.executeSql('DELETE FROM logs WHERE id = ?', [1]); });
本地存储(LocalStorage)
LocalStorage是一个较新的API,它提供了一个在用户浏览器中存储键值对的方式。与Web SQL Database不同,LocalStorage更适合存储少量的数据。
-
存储数据:
localStorage.setItem('username', 'exampleUser');
-
检索数据:
var username = localStorage.getItem('username');
-
删除单个数据项:
localStorage.removeItem('username');
-
清除所有存储数据:
localStorage.clear();
-
检查LocalStorage的存储空间:
var usedSpace = localStorage.length;
-
使用事件监听LocalStorage的变化:
window.addEventListener('storage', function(event) {if (event.key === 'someKey') {console.log('someKey changed to ' + event.newValue);} });
IndexedDB
IndexedDB是一个更为强大的客户端存储系统,它支持存储大量结构化数据,并且提供了一个索引机制来高效地检索数据。
-
打开数据库:
var openRequest = indexedDB.open('myDatabase', 1);
-
创建对象存储:
openRequest.onupgradeneeded = function(e) {var db = e.target.result;if(!db.objectStoreNames.contains('store')) {db.createObjectStore('store', {keyPath: 'id'});} };
-
添加数据到对象存储:
var transaction = db.transaction(['store'], 'readwrite'); var store = transaction.objectStore('store'); var request = store.add({id: 1, data: 'Some data'});
-
读取数据:
var transaction = db.transaction(['store']); var store = transaction.objectStore('store'); var request = store.get(1); request.onsuccess = function(e) {console.log(e.target.result.data); };
-
使用索引检索数据:
var index = store.index('data'); var request = index.openCursor('Some data'); request.onsuccess = function(e) {var cursor = e.target.result;if(cursor) {console.log(cursor.key);cursor.continue();} };
-
删除数据:
var request = store.delete(1);
-
遍历对象存储:
var cursorRequest = store.openCursor(); cursorRequest.onsuccess = function(e) {var cursor = e.target.result;if(cursor) {console.log(cursor.value);cursor.continue();} };
请注意,IndexedDB是一个复杂的系统,提供了丰富的API来操作数据,上述示例仅展示了一些基本操作。实际开发中可能需要更复杂的逻辑来处理事务、错误处理和数据一致性问题。