它使用 ESP32 的一部分板载非易失性存储器 (NVS) 来存储数据。此数据在系统重启和断电事件中保留。
Preferences (首选项) 最适合存储许多小值,而不是几个大值。如果要存储大量数据,请考虑使用 LitteFS 等文件系统库。
Preferences 库可供所有 ESP32 变体使用。
#include <Preferences.h>
首选项直接支持以下数据类型:
表 1 — 首选项数据类型首选项类型 | 数据类型 | 大小 (字节) |
---|---|---|
Bool | bool | 1 |
Char | int8_t | 1 |
UChar | uint8_t | 1 |
Short | int16_t | 2 |
UShort | uint16_t | 2 |
Int | int32_t | 4 |
UInt | uint32_t | 4 |
Long | int32_t | 4 |
ULong | uint32_t | 4 |
Float | float_t | 4 |
Long64 | int64_t | 8 |
ULong64 | uint64_t | 8 |
Double | double_t | 8 |
String | const char* | variable |
String | ||
Bytes | uint8_t | variable |
字符串值可以作为 Arduino String 或以 null 结尾的 char 数组 (c-string) 进行存储和检索。
Bytes 类型用于在命名空间中存储和检索任意数量的字节。
从 NVS 分区中打开具有给定命名空间名称的非易失性存储器。
Parameters 参数bool begin(const char * name, bool readOnly=false, const char* partition_label=NULL)
Returns 返回
- name (必需)
- 命名空间名称。最大长度为 15 个字符。
- readOnly (可选)
- false 将以读写模式打开命名空间。
- true 将以只读模式打开命名空间。
- 如果省略,则以读写模式打开命名空间。
- partition_label (可选)
- 要在其中打开命名空间的 NVS 分区的名称。
- 如果省略,则命名空间将在 “nvs” 分区中打开。
Notes 笔记
- true,表示命名空间打开成功;否则为 false。
- 如果分区中不存在命名空间,则首先创建该命名空间。
- 尝试将键值写入以只读模式打开的命名空间将失败。
- 将向 arduino-esp32 log_e 工具发送一条消息,说明呼叫失败的原因。
关闭当前打开的命名空间。
Parameters 参数void end()
Returns 返回
- None 没有
Note 注意
- Nothing 无
- 关闭命名空间后,用于访问它的方法将失败。
从当前打开的命名空间中删除所有键和值。
Parameters 参数bool clear()
Returns 返回
- None 没有
Note 注意
- 如果删除了所有键和值,则为 true;否则为 false。
- 之后,命名空间名称仍然存在。
- 将向 arduino-esp32 log_e 工具发送一条消息,说明呼叫失败的原因。
从当前打开的命名空间中删除键值对。
Parameters 参数bool remove(const char * key)
Returns 返回
- key (必需)
- 需要删除的 Key 的名称。
Note 注意
- 如果删除了键值对,则为 true;否则为 false。
- 将向 arduino-esp32 log_e 工具发送一条消息,说明呼叫失败的原因。
检查当前打开的命名空间中是否存在键值对。
Parameters 参数bool isKey(const char * key)
Returns 返回
- key (必需)
- 要检查的键的名称。
Note 注意
- 如果存在键值对,则为 true;否则为 false。
- 尝试在命名空间未打开的情况下检查键将返回 false。
在当前打开的命名空间中存储针对给定键的值。
Parameters 参数size_t putChar(const char* key, int8_t value) size_t putUChar(const char* key, uint8_t value)
Returns 返回
- key (必需)
- 如果 key 在当前打开的命名空间中不存在,则首先创建该 key。
- value (必需)
- 必须与方法的数据类型匹配。
Notes 笔记
- 如果调用成功,则为 1 (为这些数据类型存储的字节数);否则为 0。
- 尝试在未以读写模式打开命名空间的情况下存储值将失败。
- 将向 arduino-esp32 log_e 工具发送一条消息,说明呼叫失败的原因。
在当前打开的命名空间中存储针对给定键的值。
Parameters 参数size_t putShort(const char* key, int16_t value) size_t putUShort(const char* key, uint16_t value)
Returns 返回
- key (必需)
- 如果 key 在当前打开的命名空间中不存在,则首先创建该 key。
- value (必需)
- 必须与方法的数据类型匹配。
Notes 笔记
- 2 (为这些数据类型存储的字节数) 如果调用成功;否则为 0。
- 尝试在未以读写模式打开命名空间的情况下存储值将失败。
- 将向 arduino-esp32 log_e 工具发送一条消息,说明呼叫失败的原因。
在当前打开的命名空间中存储针对给定键的值。
Parameters 参数size_t putInt(const char* key, int32_t value) size_t putUInt(const char* key, uint32_t value) size_t putLong(const char* key, int32_t value) size_t putULong(const char* key, uint32_t value) size_t putFloat(const char* key, float_t value)
Returns 返回
- key (必需)
- 如果 key 在当前打开的命名空间中不存在,则首先创建该 key。
- value (必需)
- 必须与方法的数据类型匹配。
Notes 笔记
- 4 (为这些数据类型存储的字节数) 如果调用成功;否则为 0。
- 尝试在未以读写模式打开命名空间的情况下存储值将失败。
- 将向 arduino-esp32 log_e 工具发送一条消息,说明呼叫失败的原因。
在当前打开的命名空间中存储针对给定键的值。
Parameters 参数size_t putLong64(const char* key, int64_t value) size_t putULong64(const char* key, uint64_t value) size_t putDouble(const char* key, double_t value)
Returns 返回
- key (必需)
- 如果 key 在当前打开的命名空间中不存在,则首先创建该 key。
- value (必需)
- 必须与方法的数据类型匹配。
Notes 笔记
- 如果调用成功,则为 8 (为这些数据类型存储的字节数);否则为 0。
- 尝试在未以读写模式打开命名空间的情况下存储值将失败。
- 将向 arduino-esp32 log_e 工具发送一条消息,说明呼叫失败的原因。
在当前打开的命名空间中存储针对给定键的值。
Parameters 参数size_t putBool(const char* key, bool value)
Returns 返回
- key (必需)
- 如果 key 在当前打开的命名空间中不存在,则首先创建该 key。
- value (必需)
- 必须与方法的数据类型匹配。
Notes 笔记
- 如果成功,则为 true;否则为 false。
- 尝试在未以读写模式打开命名空间的情况下存储值将失败。
- 将向 arduino-esp32 log_e 工具发送一条消息,说明呼叫失败的原因。
在当前打开的命名空间中存储针对给定键的可变长度值。
Parameters 参数size_t putString(const char* key, const char* value); size_t putString(const char* key, String value);
Returns 返回
- key (必需)
- 如果 key 在当前打开的命名空间中不存在,则首先创建该 key。
- value (必需)
- 如果 const char*,则为以 null 结尾的 (C 字符串) 字符数组。
- 如果为 String,则为有效的 Arduino String 类型。
Notes 笔记
- 如果成功:存储的字节数;否则为 0。
- 尝试在未以读写模式打开命名空间的情况下存储值将失败。
- 将向 arduino-esp32 log_e 工具发送一条消息,说明呼叫失败的原因。
在当前打开的命名空间中针对给定键存储可变数量的字节。
Parameters 参数size_t putBytes(const char* key, const void* value, size_t len);
Returns 返回
- key (必需)
- 如果 key 在当前打开的命名空间中不存在,则首先创建该 key。
- value (必需)
- 指向包含要存储的字节的数组或缓冲区的指针。
- len (必需)
- 要存储的 value 的字节数。
Notes 笔记
- 如果成功:存储的字节数;否则为 0。
- 尝试在未以读写模式打开命名空间的情况下存储值将失败。
- 此方法对基础数据类型使用的字节进行作,而不是对给定数据类型的元素数进行作。之后,Preferences 库不会保留 value 的数据类型。
- 将向 arduino-esp32 log_e 工具发送一条消息,说明呼叫失败的原因。
检索针对当前打开的命名空间中的给定键存储的值。
Parameters 参数int8_t getChar(const char* key, int8_t defaultValue = 0) uint8_t getUChar(const char* key, uint8_t defaultValue = 0)
Returns 返回
- key (必需)
- defaultValue(可选)
- 必须与方法的数据类型匹配(如果提供)。
Notes 笔记
- the value stored against key if the call is successful.
如果调用成功,则针对 key 存储的值。- defaultValue, if it is provided; 0 otherwise.
defaultValue(如果提供);否则为 0。
- 在没有命名空间可用的情况下尝试检索密钥将失败。
- 尝试从不存在的键中检索值将失败。
- 将向 arduino-esp32 log_e 工具发送一条消息,说明呼叫失败的原因。
检索针对当前打开的命名空间中的给定键存储的值。
int16_t getShort(const char* key, int16_t defaultValue = 0) uint16_t getUShort(const char* key, uint16_t defaultValue = 0)
Except for the data type returned, behaves exactly like getChar.
除了返回的数据类型外,其行为与 getChar 完全相同。
Retrieve a value stored against a given key in the currently open namespace.
检索针对当前打开的命名空间中的给定键存储的值。int32_t getInt(const char* key, int32_t defaultValue = 0) uint32_t getUInt(const char* key, uint32_t defaultValue = 0)
除了返回的数据类型外,其行为与 getChar 完全相同。
检索针对当前打开的命名空间中的给定键存储的值。
int32_t getLong(const char* key, int32_t defaultValue = 0) uint32_t getULong(const char* key, uint32_t defaultValue = 0)
除了返回的数据类型外,其行为与 getChar 完全相同。
检索针对当前打开的命名空间中的给定键存储的值。
int64_t getLong64(const char* key, int64_t defaultValue = 0) uint64_t getULong64(const char* key, uint64_t defaultValue = 0)
除了返回的数据类型外,其行为与 getChar 完全相同。
检索针对当前打开的命名空间中的给定键存储的值。
float_t getFloat(const char* key, float_t defaultValue = NAN)
除了返回的数据类型和 defaultValue 的值外,其行为与 getChar 完全相同。
检索针对当前打开的命名空间中的给定键存储的值。
double_t getDouble(const char* key, double_t defaultValue = NAN)
除了返回的数据类型和 defaultValue 的值外,其行为与 getChar 完全相同。
检索针对当前打开的命名空间中的给定键存储的值。
bool getBool(const char* key, bool defaultValue = false);
除了返回的数据类型外,其行为与 getChar 完全相同。
将针对当前打开的命名空间中的给定键存储的 char 字符串复制到缓冲区。
size_t getString(const char* key, char* value, size_t len);
Parameters 参数Returns 返回
- key (必需)
- value (必需)
- 大小足以容纳 len 字节的缓冲区
- len (必需)
- 要写入 value 指向的缓冲区的类型 char' 的数量
Notes 笔记
- 如果成功;等于 len 的字节数将写入 value 指向的缓冲区,该方法返回 1。
- 如果方法失败,则不会将任何内容写入 value 指向的缓冲区,并且该方法返回 0。
- len 必须等于针对 key 存储的字节数,否则调用将失败。
- 将向 arduino-esp32 log_e 工具发送一条消息,说明呼叫失败的原因。
检索针对当前打开的命名空间中的给定键存储的 Arduino String 值。
String getString(const char* key, String defaultValue = String());
Parameters 参数Returns 返回
- key (必需)
- defaultValue(可选)
Notes 笔记
- 如果调用成功,则针对 key 存储的值
- 如果方法失败:如果提供,则返回 defaultValue;否则为 “”( 空 String)。
- defaultValue 的类型必须为 String。
将针对当前打开的命名空间中的给定键存储的一系列字节复制到缓冲区。
size_t getBytes(const char* key, void * buf, size_t len);
Parameters 参数Returns 返回
- key (必需)
- buf (必需)
- 大小足以容纳 len 字节的缓冲区。
- len (必需)
- 要写入 buf 指向的缓冲区的字节数
Notes 笔记
- 如果成功,则等于 len 的字节数将写入缓冲区 buf,该方法返回 len。
- 如果方法失败,则不会向缓冲区写入任何内容,并且该方法返回 0。
- len 必须等于针对 key 存储的字节数,否则调用将失败。
- 将向 arduino-esp32 log_e 工具发送一条消息,说明呼叫失败的原因。
根据当前打开的命名空间中 Bytes 类型的键获取值中存储的字节数。
size_t getBytesLength(const char* key)
Parameters 参数Returns 返回
- key (必需)
Notes 笔记
- 如果成功:针对 key 存储的值中的字节数;否则为 0。
- 如果 key 不是 Bytes 类型,该方法将失败。
- 将向 arduino-esp32 log_e 工具发送一条消息,说明呼叫失败的原因。
获取当前打开的命名空间中给定键的 Preferences 数据类型。
PreferenceType getType(const char* key)
Parameters 参数表 2 — getType 返回值Returns 返回
- key (必需)
Notes 笔记
- 一个 int 值,如下表 2 所示。
- 如果调用失败,则值为 10 (PT_INVALID)。
- 返回值在 Preferences.h 中枚举。表 2 包括列举的值以供参考。
- 返回值可以映射到多个 Prefs 类型。
- 如果出现以下情况,该方法将失败:命名空间未打开;密钥不存在;提供的密钥超过 15 个字符。
返回值 | 首选项类型 | 数据类型 | 枚举值 |
---|---|---|---|
0 | Char | int8_t | PT_I8 |
1 | UChar | uint8_t | PT_U8 |
Bool | bool | ||
2 | Short | int16_t | PT_I16 |
3 | UShort | uint16_t | PT_U16 |
4 | Int | int32_t | PT_I32 |
Long | |||
5 | UInt | uint32_t | PT_U32 |
ULong | |||
6 | Long64 | int64_t | PT_I64 |
7 | ULong64 | uint64_t | PT_U64 |
8 | String | String | PT_STR |
*char | |||
9 | Double | double_t | PT_BLOB |
Float | float_t | ||
Bytes | uint8_t | ||
10 | - | - | PT_INVALID |
获取当前打开的命名空间的键表中可用的空闲条目数。
size_t freeEntries()
Parameters 参数Returns 返回
- none 没有
Notes 笔记
- 如果成功:当前打开的命名空间的 key 表中可用的空闲条目数;否则为 0。
- 存储 Bool、Char、UChar、Short、UShort、Int、UInt、Long、ULong、Long64、ULong64 类型的值的键使用键表中的一个条目。
- 存储 Float 和 Double 类型的值的 keys 使用 key 表中的三个条目。
- Arduino 或 c-string String 类型至少使用两个键表条目,条目数随着字符串长度的增加而增加。
- 存储 Bytes 类型值的键至少使用三个键表条目,条目数随着存储的字节数而增加。
- 将向 arduino-esp32 log_e 工具发送一条消息,说明呼叫失败的原因。