3.2 新建数据库

新建数据库与打开数据库是同一个操作。如果指定的数据库不存在,就会新建。不同之处在于,后续的操作主要在upgradeneeded事件的监听函数里面完成,因为这时版本从无到有,所以会触发这个事件。

通常,新建数据库以后,第一件事是新建对象仓库(即新建表)。

  1. request.onupgradeneeded = function(event) {
  2. db = event.target.result;
  3. var objectStore = db.createObjectStore('person', { keyPath: 'id' });
  4. }

上面代码中,数据库新建成功以后,新增一张叫做person的表格,主键是id

更好的写法是先判断一下,这张表格是否存在,如果不存在再新建。

  1. request.onupgradeneeded = function (event) {
  2. db = event.target.result;
  3. var objectStore;
  4. if (!db.objectStoreNames.contains('person')) {
  5. objectStore = db.createObjectStore('person', { keyPath: 'id' });
  6. }
  7. }

主键(key)是默认建立索引的属性。比如,数据记录是{ id: 1, name: '张三' },那么id属性可以作为主键。主键也可以指定为下一层对象的属性,比如{ foo: { bar: 'baz' } }foo.bar也可以指定为主键。

如果数据记录里面没有合适作为主键的属性,那么可以让 IndexedDB 自动生成主键。

  1. var objectStore = db.createObjectStore(
  2. 'person',
  3. { autoIncrement: true }
  4. );

上面代码中,指定主键为一个递增的整数。

新建对象仓库以后,下一步可以新建索引。

  1. request.onupgradeneeded = function(event) {
  2. db = event.target.result;
  3. var objectStore = db.createObjectStore('person', { keyPath: 'id' });
  4. objectStore.createIndex('name', 'name', { unique: false });
  5. objectStore.createIndex('email', 'email', { unique: true });
  6. }

上面代码中,IDBObject.createIndex()的三个参数分别为索引名称、索引所在的属性、配置对象(说明该属性是否包含重复的值)。