Client-Side Data Storage
目录
介绍
- 这里的Client-Side指的还是Web开发,不是移动App的native端
- 缺点
- 没有同步支持
- 容量限制
- 不能代替完全的数据库服务器
Cookies
- document.cookie = "name=Raymond; expires=Fri, 31 Dec 9999 23:59:59 GMT; domain=app.foo.com";
- 删除:document.cookie = "name=Raymond; expires=Thu, 01 Jan 1970 00:00:00 GMT"; //设置过期时间为以前的时间
- https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie
Web(Local) Storage
- localStorage.setItem["something"] = 1 //这语法倒也蛮奇怪的
- names=[...]; localStorage.setItem("names", names); //name-value只支持字符串
- localStorage.setItem("names", JSON.stringify(names));
- var storedNames = JSON.parse(localStorarge.getItem("names"));
- $(window).on("storage", function(e) { ... }); //e.originalEvent.newValue
IndexDB
- var openRequest = indexedDB.open("ora_idb1",1);
- 创建Object Stores
- openRequest.onupgradeneeded = function(e) {
- var thisDB = e.target.result;
-
if(!thisDB.
objectStoreNames.contains("firstOS"))
- thisDB. createObjectStore("firstOS");
- openRequest.onupgradeneeded = function(e) {
- 定义主键
- somedb.createObjectStore("people", {keyPath: "email"});
- somedb.createObjectStore("logs", {keyPath: "id", autoIncrement:true});
- 定义索引
- bjectStore.createIndex("name of index", "path", options); //大部分情况下前2个参数取相同的值
- objectStore.createIndex("gender", "gender", {unique:false}); //这个方法从RDBMS的角度来看有点原始?
- 操作数据
- wrap以事务
- var transaction = db.transaction(["people"],"readwrite");
- var store = transaction.objectStore("people");
- var request = store.add(person);
- request.onsuccess = function(e) { ... } //所有的操作都是异步的?异步+ACID??
- 读事务
- var transaction = db.transaction(["people"],"readonly");
- ...
- var request = store.get(key);
- request.onsuccess = function(e) {
- var result = e.target.result; //这个2级.号语法有点诡异
- //如果试图获取一个不存在的对象,onsuccess回调仍然会执行
- 更新(嗯?API区分了2种写操作:创建与更新?)
- var request = store.put(person);
- 删除:var request = store.delete(key);
- 获取全部数据?
- var cursor = objectStore.openCursor();
- cursor.onsuccess = function(e) {
- var res = e.target.result;
- ...
- res.continue(); //触发游标移动到下一个数据?
- Ranges:范围就是对索引的过滤
- range = IDBKeyRange.upperBound("Camden"); //key必须<"Camden"
- cursor = someIndex.openCursor(range);
- objectStore.createIndex("hobbies", "hobbies", {unique:false, multiEntry:true});
- hobbies属性的取值是一个array,so?把数组中的每一个加入到索引中去??——这API感觉还是有点原始~
- 计数:
- db.transaction(["note"],"readonly").objectStore("note").count().onsuccess = ...
- wrap以事务
- IndexDB是对客户端数据库(简化版的关系数据库)的一个很好的抽象吗?我不这么认为
- 但是这里注意IndexDB至少提供了一个快速索引能力。。。
Web SQL
- Dead Spec Walking
- 其实Web SQL就是对SQLite的JS API绑定
- db = window.openDatabase("db1", "1", "Database 1", 5*1024*1024);
- db.readTransaction(function to do stuff, error handler, success handler); //这个API居然不是Promise风格的
- function(tx) { tx.executeSql("select * from foo"); }
- 写事务:(这里怎么直接拼sql语句了?)
库
- Lockr, a wrapper for Web Storage
- 这种封装没有必要吧?无聊
- Simplifying IndexedDB with Dexie
- 有Promise化的API封装
- localForge
- localforage.setItem("name", value, function(err, value) {});
- Promise版本:localforage.setItem("name", value).then(function(value) { });
- localforage.setItem("name", value, function(err, value) {});
- http://pouchdb.com/ 支持数据同步???