一、indexDB
最近给win8的一个项目搞得晕头转向的,不过弄懂之后发现确实学到了很多东西,其中一个是关于数据存储的,window自带的类似数据库之类的东西,index database。其实最初index DB是用在web上用来存储数据的,但它在win8应用中同样可以使用,而且使用起来很方便,理解起来也很容易,需要注意的是一些规范之类的,稍微一个不细心都会存储失败或者读不到数据,index DB api里面对异常抛出的类型和原因都说得很清楚,这里就不多说了,就说一些index DB的用法
首先是创建一个index DB:
function createDB() { //创建一个indexDB var dbRequest = window.indexedDB.open("MyDB", 1); // Add asynchronous callback functions dbRequest.onerror = function () { console.log("Error creating database."); }; dbRequest.onsuccess = function (evt) {
//创建成功之后要做的事情 createDBSuccess(evt); }; dbRequest.onupgradeneeded = function (evt) {
//第一次创建数据库时要做的事情在此实现 createDBVersionUpgrade(evt); }; dbRequest.onblocked = function () { console.log("Database create blocked."); }; // Reset the flag that indicates whether this is a new creation request. // Assume that the database was previously created.
//下一打开indexDB时做的判断,如果已存在数据库则直接打开 dbCreate = false; }删除数据库只需语句var dbRequest = window.indexedDB.deleteDatabase("MyDB");同样在三个callback函数里实现要做的事情(onerror,onsuccess,onblocked)
首先获得该数据库的一个操作对象:MyDB.db = evt.target.result; 再获取transaction:var txn = evt.target.transaction;接着创建ObjectStore
var courseStore = MyDB.db.createObjectStore("courses", { keyPath: "divId", autoIncrement: true });
courseStore.createIndex("courseText", "courseText", { unique: false });
course是名字,keyPath从字面上理解就知道它的意思了,删除一条记录可根据它来删除,接着创建索引,索引不是一定得创建的,只是当你的数据需要用到索引的时候,创建其索引会带来很大的查询方便
至此你就创建了一个名为MyDB的数据库,里面有一个courses的objectstore
接来写数据读数据都得先打开数据库,其实跟代码部分跟创建时的差不了多少,只是这一次在打开成功后做的事情不同而已,同样需要获得操作对象evt.target.result
这时打开transaction:var txn = MyDB.db.transaction("courses", "readwrite");这样就打开了courses数据库,“readwrite”是对数据库的操作允许方式,这里设为可读写
读数据时,有一个openCursor函数:var courseCursorRequest = txn.objectStore("courses").index("courseText").openCursor();,有设置index的话就把index加上去,没有的话就不用
在courseCursorRequest 的onsuccess事件里读取courses里面的数据
courseCursorRequest.onsuccess = function (e) { var cursor = e.target.result; if (cursor) { if (id == cursor.value.divId) { document.getElementById(id).innerText = cursor.value.courseText; } cursor.continue(); } };
写数据时,就不用调用openCursor函数,直接var courses = txn.objectStore("courses").index("courseText")
最常使用的就是add和delete操纵啦,直接用courses添加删除即可,同样在添加删除成功事件响应里也可以实现成功后要做的事情
大概就这些东西,其实也没什么好说的,创建删除数据库,读写数据库里的数据,最基本的就这些,目前自己使用到的也只有这些,说说要注意的地方吧,首先添加记录的时候,要注意是否已经存在了具有相同标识的记录,最好在添加失败的响应函数里做一些操作,提示一下,不然很容易就会添加失败然后找了很久都不知道什么原因,再就是删除操作,删除只需要一个参数,唯一标识记录的key,必须和原记录里的key是相同类型,这里一般情况下都可以根据keyPath去删除记录,这也很容易出错的操作
二、文件访问小结
学win8 APP开发学了这么久,一些细节的东西还是没留意到,感觉有点失败,最近纠结一个问题很久,今天一早不经意间就解决了这个问题。是这样的,我的应用里需要存储图片,然后我想把图片存到应用文件的目录下,即installedLocation,结果碰了一鼻子灰,纠结了一晚上,想着怎么把图片存到installedLocation的目录下,结果一查开发文档发现,installedLocation里面的东西是只读不可写的,这让我瞬间崩溃。其实为什么我会纠结图片存储的这个问题呢,原来在我获得一张图片的路径后我直接赋值给了img的src属性,结果出现一个中之操作的东西,具体的原因我不清楚,不过我猜大概又是什么安全问题的。
今天一早又起来继续纠结这个问题,其实Windows提供很多给用户存放appdata的目录,我就想着,行吧,存不进installedLocation,就存进可存的地方得了。结果又发现了一些细节的东西,原来引用installedLocation里的文件,需要在路径前面加ms-appx:///,引用Location里面的文件,要换成ms-appdata:///,这样,我的问题就解决了,我把图片存起来了,又得到了可寻的图片路径,其实这些细节的东西,平时真没怎么留意,非得在开发过程中才慢慢的遇到这些问题,下面分享一下外国的一遍关于文件访问的博文File system places accessible through WinRT API