From 522984283b56b68582d606c76e4ca98c0baf9451 Mon Sep 17 00:00:00 2001 From: MDN Date: Tue, 15 Jun 2021 00:35:40 +0000 Subject: [CRON] sync translated content --- .../basic_concepts_behind_indexeddb/index.html | 204 --------------------- 1 file changed, 204 deletions(-) delete mode 100644 files/zh-cn/web/api/indexeddb_api/basic_concepts_behind_indexeddb/index.html (limited to 'files/zh-cn/web/api') diff --git a/files/zh-cn/web/api/indexeddb_api/basic_concepts_behind_indexeddb/index.html b/files/zh-cn/web/api/indexeddb_api/basic_concepts_behind_indexeddb/index.html deleted file mode 100644 index dfbfa97dd6..0000000000 --- a/files/zh-cn/web/api/indexeddb_api/basic_concepts_behind_indexeddb/index.html +++ /dev/null @@ -1,204 +0,0 @@ ---- -title: 基本概念 -slug: Web/API/IndexedDB_API/Basic_Concepts_Behind_IndexedDB -tags: - - IndexedDB 总述 -translation_of: Web/API/IndexedDB_API/Basic_Concepts_Behind_IndexedDB ---- -

{{DefaultAPISidebar("IndexedDB")}}

- -
-

IndexedDB 是一种在用户浏览器中持久存储数据的方法。它允许您不考虑网络可用性,创建具有丰富查询能力的可离线 Web 应用程序。IndexedDB 对于存储大量数据的应用程序(例如借阅库中的 DVD 目录)和不需要持久 Internet 连接的应用程序(例如邮件客户端、待办事项列表或记事本)很有用。

-
- -

关于本文档

- -

本简介讨论了 IndexedDB 中的基本概念和术语。为您提供了概览并解释了关键概念。

- -

您会发现以下非常有用的内容:

- - - -

 IndexedDB概况

- -

使用IndexedDB,你可以使用一个key作为索引进行存储或者获取数据。 你可以在事务(transaction)中完成对数据的修改。和大多数web存储解决方案相同,indexedDB也遵从同源协议(same-origin policy). 所以你只能访问同域中存储的数据,而不能访问其他域的。

- -

IndexedDB 是一种异步(asynchronous) API,异步API适用于大多数情况,包括Web Workers。因为在Web Workers上的使用,它过去也有一个同步(synchronous)的版本,但是因为缺少web社区的支持,它已经被从规范中移除了。

- -

IndexedDB 过去有一个竞争规范—— WebSQL 数据库,但是W3C组织在2010年11月18日废弃了webSql。尽管两者都是存储的解决方案,但是他们提供的不是同样的功能。IndexedDB 和WebSQL的不同点在于WebSQL 是关系型数据库访问系统,IndexedDB 是索引表系统(key-value型)。

- -

基本概念

- -

如果你因为使用其他类型数据库有某些固定思维,那么你在使用IndexedDB的时候可能会感到困惑,所以请牢记以下重要的概念:

- - - -

名词解释

- -

本节定义并解释了IndexedDB API中所使用的术语

- -

数据库

- -
-
数据库(database)
-
一个信息库,通常包含一个或多个 object stores. 每个数据库必须包含以下内容:
-
-
    -
  • 名字(Name)。它标识了一个特定源中的数据库,并且在数据库的整个生命周期内保持不变。  此名字可以为任意字符串值(包括空字符串)。
  • -
  • 当前版本(version)。当一个数据库首次创建时,它的 version 为1,除非另外指定. 每个数据库在任意时刻只能有一个 version。
  • -
-
-
持久性(durable)
-
在 Firefox 中,IndexedDB 是持久的,也就是说在一个读写事务中,一旦 IDBTransaction.oncomplete 事件被触发,就代表着数据已经确保被写入磁盘中了。
-
从 Firfox 40 起,IndexedDB 事务放松了对持久性的保证以提高性能(参见 Bug1112702),这与其他支持 IndexedDB 的浏览器的处理方式相同。在这种情况下,当操作系统被告知去写入数据后 complete 事件便被触发,但此时数据可能还没有真正的写入磁盘。事件触发因此变得更快,但这样会有极小的机会发生以下情况:如果操作系统崩溃或在数据被写入磁盘前断电,那么整个事务都将丢失。由于这种灾难事件是罕见的,大多数使用者并不需要过分担心。
-
对象仓库(object store)
-
-

数据在数据库中存储的方式, 数据以键值对形式被对象仓库永久持有。对象仓库中的的数据以 keys 升序排列。

- -

每一个对象仓库在同一个数据库中必须有唯一的名字。对象存储可以有一个 key generator 和一个 key path如果对象仓库有 key path,则使用 in-line keys; 否则使用 out-of-line keys

- -

关于对象仓库的详细文档,请参考 IDBObjectStore 或者 IDBObjectStoreSync

-
-
版本(version)
-
当第一次创建一个数据库,它的版本为整型1。每个数据库依次有一个版本号; 一个数据库不能同时存在多个版本号。改变版本的唯一方法是通过一个比当前版本号更高的值去打开数据库。这会开启一个 VERSION_CHANGE 事务并且触发 upgradeneeded 事件。只有在该事件的处理函数中才能更新数据库模式。
-
注意:这里的描述以最新规范为准,这些规范可能只在最新的浏览器中实现了。老旧的浏览器实现了现在已弃用和移除的 IDBDataBase.setVersion() 方法。
-
数据库连接(database connection)
-
通过打开数据库创建的操作。一个给定的数据库可以同时拥有多个连接。
-
事务(transaction)
-
在一个特定的数据库上,一组具备原子性和持久性的数据访问和数据修改的操作。它是你与数据库交互的方式。并且,任何对于数据库中的数据读和修改的操作只能在事务中进行。
-
-

一个数据库连接可以拥有多个与之关联的事务,只要进行写操作事务的作用域不相互重合。事务的作用域在事务被创建时就被确定,指定事务能够进行交互的对象仓库(object store),作用域一旦被确定就会在整个生命周期中保持不变。举个例子,如果一个数据库连接已经有了一个进行写操作的事务,其作用域覆盖 flyingMonkey 对象仓库,你可以开启新的事务其作用于 unicornCentaurunicornPegasus 对象仓库。对于读操作的事务,你可以同时拥有多个,即使他们有重叠的作用域。

- -

事务被期望拥有较短的生命周期,所以浏览器会终止一个消耗时间过长的事务,为了释放存储资源,运行过久的事务会被锁定。你可以中断一个事务,来回滚事务中对数据库进行的操作。并且你甚至不需要等待事务开始或激活就可以中断它。

- -

事务有三种模式:读写、只读和版本变更。创建和删除对象仓库(object store)的唯一方法就是通过调用版本变更事务。了解更多关于事务类型的内容,请参考 IndexedDB

- -

因为所有的事情都在事务中发生,所以它是 IndexedDB 中非常重要的一个概念。了解更多关于事务,尤其是关于它和版本控制的关联,查看 IDBTransaction 中的参考文档。关于同步接口的文档,查看 IDBTransactionSync

-
-
请求(request)
-
在数据库上进行读写操作完成后的操作。每一个请求代表一个读或写操作。
-
索引(index)
-
-

一个对象仓库,专门用来查找另一个对象仓库(object store)中的记录,其中被查找的对象仓库被称为引用对象仓库。索引(index)是一个稳定的键值对(key-value)存储,其记录中的值(value)是引用对象仓库记录中的键(key)。当引用对象仓库中的记录新增、更新或删除时,索引中的记录会自动的进行粒子性增加。索引中的每一条记录只能指向引用对象仓库中的一条记录,但多个索引可以引用同一个对象仓库。当对象仓库发生改变时,所有引用该对象仓库的引用均会自动更新。

- -

可选地,你也可以适用键(key)再对象仓库中查找记录。

- -

了解更多关于如何适用索引,查看使用 IndexedDB。index 的参考文档查看 IDBKeyRange

-
-
- -

键和值

- -
-
键(key)
-
在对象仓库中阻止和检索被存储起来的值的数据值。数据仓库的键来源于以下三个方式之一:键生成器、键路径和显式指定的值。键必须是一种能够比较大小的数据类型。在同一个对象仓库中每条记录必须有一个独一无二的键,所以你不能在同一个对象仓库中为多个记录设置同样的键。
-
-

键可以是以下数据类型:字符串、日期、浮点和数组。对于数组,键的取值可以从空数组到无穷。并且你可以使用嵌套数组。注意,在 Firefox 11 之前的版本键只接受字符串和整形。

- -

可选地,你也可以通过索引(index)来查找记录。

-
-
键生成器(key generator)
-
一种生成有序键的机制。如果一个对象仓库并不具备一个键生成器,那么应用程序必须为被存储的记录提供键。生成器在仓库之间并不共享。它更多的是浏览器的实现细节,因为在 Web 开发中你并不会真正的去创建或访问键生成器。
-
内键(in-line key)
-
作为存储值一部分的键。内键由键路径(key path)查找。内键由生成器生成。当内键生成后,它会被键路径存储在值中,它也可以被当作键使用。
-
外键(out-of-line key)
-
与值分开存储的键。
-
键路径(key path)
-
指定浏览器如何从对象仓库或索引存储的值中提取键。一个合法的键路径可以是以下形式:一个空字符串,一个 JavasScript 标识符,或由句点分割的多个 JavaScript 标识符。但不能包括空格。
-
值(value)
-
每条记录包含一个值,该值可以包含任何 JavaScript 表达式,包括:布尔数字字符串日期对象数组正则未定义和 null。
-
-

对于对象和数组,它们的属性和值也可以是任意合法的值。

- -

规范允许你存储文件和二进制对象,但该标准只被 Firefox 11+ 实现。

-
-
- -

范围和作用域

- -
-
作用域(scope)
-
事务所作用的一组对象仓库或索引。只读事务的作用域可以相互重叠并同时执行操作。但写操作事务的作用域不可以相互重叠。但你仍然可以同时开启多个拥有相同作用域的事务,只要保证他们的操作不会同时执行。
-
游标(cursor)
-
在键的某个范围内迭代查询多条记录的机制。游标有一个指向正在被迭代的对象仓库或索引的源。它处于该范围内的一个位置,并按照键的顺序正向或逆向的移动。有关游标的参考文档,查看 IDBCursorIDBCursorSync
-
键范围(key range)
-
用做键的数据类型上的连续的间隔。使用键或键的某个范围可以从对象仓库和索引中读取记录。你可以通过上限和下限设置和筛选范围。比如,你可以遍历 x 和 y 之间所有的键值。
-
有关键范围的参考文档,查看 IDBKeyRange.
-
- -

局限性

- -

以下情况不适合使用IndexedDB

- - - -

注意,在以下情况下,数据库可能被清除:

- - - -

确切的环境和浏览器特性会随着时间改变,但浏览器厂商通常会遵循尽最大努力保留数据的理念。

- -

下一步

- -

查看如何使用的文档: Using IndexedDB.

- -

相关文章

- - -- cgit v1.2.3-54-g00ecf