您的位置:首页 > Web前端 > JavaScript

WinJS indexDB和一些文件访问小结

2013-03-29 14:49 411 查看
一、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)

在创建数据成功后,在createDBVersionUpgrade(evt)函数里创建你的数据库里所含有的东西

首先获得该数据库的一个操作对象: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();
}
};


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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: