From c6fe198d237095a01988f7a1ecd0c3526bb2135d Mon Sep 17 00:00:00 2001 From: Annie_wang Date: Thu, 1 Sep 2022 11:37:14 +0800 Subject: [PATCH] update docs Signed-off-by: Annie_wang --- .../database-preference-guidelines.md | 118 ++-- .../database/database-preference-overview.md | 25 +- .../database/figures/preferences.png | Bin 33953 -> 35808 bytes .../apis/js-apis-data-preferences.md | 519 +++++++++--------- 4 files changed, 346 insertions(+), 316 deletions(-) diff --git a/en/application-dev/database/database-preference-guidelines.md b/en/application-dev/database/database-preference-guidelines.md index b65916cdd1..fdb6929752 100644 --- a/en/application-dev/database/database-preference-guidelines.md +++ b/en/application-dev/database/database-preference-guidelines.md @@ -2,45 +2,48 @@ > **NOTE** > -> This feature is supported since API Version 9. For the versions earlier than API Version 9, use [Lightweight Storage](../reference/apis/js-apis-data-storage.md) APIs. +> This feature is supported since API Version 9. For the versions earlier than API version 9, use [Lightweight Storage](../reference/apis/js-apis-data-storage.md) APIs. ## When to Use -Preferences are ideal for storing data frequently used by applications, but not for storing a large amount of data or data with frequent changes. The application data is persistently stored on a device in the form of files. Note that the instance accessed by an application contains all data of the file. The data is always loaded to the memory of the device until the application removes it from the memory. The application can perform data operations using the **Preferences** APIs. +Preferences are used for storing the data that is frequently used by applications, but not for storing a large amount of data or data frequently changed. The application data is persistently stored on a device in the form of files. -## Available APIs +Note that the instance accessed by an application contains all data of the file. The data is always loaded to the memory of the device until the application removes it from the memory. The application can call the **Preferences** APIs to manage data. -Preferences provide capabilities for processing data in the form of key-value (KV) pairs and support data persistence, modification, and query. In KV pairs, keys are of the string type, and values can be of the number, string, or Boolean type. For more APIs related to preferences, see [Preferences](../reference/apis/js-apis-data-preferences.md). +## Available APIs -### Creating a Preferences Instance +The **Preferences** module provides APIs for processing data in the form of key-value (KV) pairs and supports persistence of the KV pairs when required. -Create a **Preferences** instance for data operations. A **Preferences** instance is created after data is read from a specified file and loaded to the instance. +The key is of the string type, and the value can be a number, a string, a Boolean value, or an array of numbers, strings, or Boolean values. -**Table 1** API for creating a **Preferences** instance +For details about **Preferences** APIs, see [Preferences](../reference/apis/js-apis-data-preferences.md). -| Package | API | Description | -| ----------------- | ------------------------------------------- | ------------------------------------------- | -| ohos.data.preferences | getPreferences(context: Context, name: string): Promise\ | Obtains a **Preferences** instance for data operations.| +### Obtaining a **Preferences** Instance -### Writing Data +Obtain a **Preferences** instance for data operations. A **Preferences** instance is obtained after data is read from a specified file and loaded to the instance. -Call the **put()** method to add or modify data in a **Preferences** instance. +**Table 1** API for obtaining a **Preferences** instance -**Table 2** API for writing data +| Package | API | Description | +| --------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| ohos.data.preferences | getPreferences(context: Context, name: string): Promise\ | Obtains a **Preferences** instance.| -| Class | API | Description | -| ------- | -------------------------------------------------- | ----------------------------------------------- | -| Preferences | put(key: string, value: ValueType): Promise\ | Writes data with the value type of number, string, boolean, Array\, Array\, or Array\.| +### Accessing Data -### Reading Data +Call the **put()** method to add or modify data in a **Preferences** instance. Call the **get()** method to read data from a **Preferences** instance. -**Table 3** API for reading data +Call **getAll()** to obtain an **Object** instance that contains all KV pairs in a **Preferences** instance. + +**Table 2** APIs for accessing **Preferences** data + +| Class | API | Description | +| ----------- | ---------------------------------------------------------- | ------------------------------------------------------------ | +| Preferences | put(key: string, value: ValueType): Promise\ | Writes data to the **Preferences** instance. The value to write can be a number, a string, a Boolean value, or an array of numbers, strings, or Boolean values.| +| Preferences | get(key: string, defValue: ValueType): Promise\ | Obtains data from the **Preferences** instance. The value to read can be a number, a string, a Boolean value, or an array of numbers, strings, or Boolean values.| +| Preferences | getAll(): Promise | Obtains an **Object** instance that contains all KV pairs in the **Preferences** instance. | -| Class | API | Description | -| ------- | ---------------------------------------------------------- | ----------------------------------------------- | -| Preferences | get(key: string, defValue: ValueType): Promise\ | Obtains data with the value type of number, string, boolean, Array\, Array\, or Array\.| ### Storing Data Persistently @@ -48,18 +51,18 @@ Call the **flush()** method to write the cached data back to its text file for p **Table 4** API for data persistence -| Class | API | Description | -| ------- | ----------------------- | --------------------------------------- | -| Preferences | flush(): Promise\ | Writes data from the **Preferences** instance back to its file through an asynchronous thread.| +| Class | API | Description | +| ----------- | ----------------------- | ------------------------------------------- | +| Preferences | flush(): Promise\ | Flushes data from the **Preferences** instance to its file through an asynchronous thread.| ### Observing Data Changes -You can subscribe to data changes. When the value of the subscribed key is changed by **flush()**, a callback will be invoked to return the new data. +You can subscribe to data changes. When the value of the subscribed key is changed and saved by **flush()**, a callback will be invoked to return the new data. **Table 5** APIs for observing **Preferences** changes -| Class | API | Description | -| ------- | ------------------------------------------------------------ | -------------- | +| Class | API | Description | +| ----------- | ------------------------------------------------------------ | -------------- | | Preferences | on(type: 'change', callback: Callback<{ key : string }>): void | Subscribes to data changes.| | Preferences | off(type: 'change', callback: Callback<{ key : string }>): void | Unsubscribes from data changes. | @@ -69,57 +72,58 @@ Use the following APIs to delete a **Preferences** instance or data file. **Table 6** APIs for deleting **Preferences** -| Package | API | Description | -| ----------------- | ---------------------------------------------------- | ------------------------------------------------------------ | -| ohos.data.preferences | deletePreferences(context: Context, name: string): Promise\; | Deletes a **Preferences** instance from the cache and deletes its file from the device.| -| ohos.data.preferences | removePreferencesFromCache(context: Context, name: string): Promise\; | Removes a **Preferences** instance from the memory to release memory. +| Package | API | Description | +| --------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| ohos.data.preferences | deletePreferences(context: Context, name: string): Promise\ | Deletes a **Preferences** instance from the memory and its files from the device.| +| ohos.data.preferences | removePreferencesFromCache(context: Context, name: string): Promise\ | Removes a **Preferences** instance from the memory to release memory. | ## How to Develop 1. Import @ohos.data.preferences and related modules to the development environment. ```js - import data_preferences from '@ohos.data.preferences' + import data_preferences from '@ohos.data.preferences'; ``` -2. Create a **Preferences** instance. +2. Obtain a **Preferences** instance. Read the specified file and load its data to the **Preferences** instance for data operations. ```js - let promise = data_preferences.getPreferences(this.context, 'mystore') + let promise = data_preferences.getPreferences(this.context, 'mystore'); ``` 3. Write data. - Use the **put()** method of the **Preferences** class to write data to the cached **Preferences** instance. + Use the **preferences.put()** method to write data to the **Preferences** instance. ```js promise.then((preferences) => { - let putPromise = preferences.put('startup', 'auto') + let putPromise = preferences.put('startup', 'auto'); putPromise.then(() => { - console.info("Put the value of startup successfully.") + console.info("Put the value of 'startup' successfully."); }).catch((err) => { - console.info("Failed to put the value of startup with err: " + err) + console.info("Failed to put the value of 'startup'. Cause: " + err); }) }).catch((err) => { - console.info("Failed to get the preferences") + console.info("Failed to get the preferences."); }) ``` 4. Read data. - Use the **get()** method of the **Preferences** class to read data. + Use the **preferences.get()** method to read data. ```js promise.then((preferences) => { - let getPromise = preferences.get('startup', 'default') + let getPromise = preferences.get('startup', 'default'); getPromise.then((value) => { - console.info("The value of startup is " + value) + console.info("The value of 'startup' is " + value); }).catch((err) => { - console.info("Failed to get the value of startup with err: " + err) + console.info("Failed to get the value of 'startup'. Cause: " + err); }) }).catch((err) => { - console.info("Failed to get the preferences")}) + console.info("Failed to get the preferences.") + }); ``` 5. Store data persistently. @@ -132,38 +136,38 @@ Use the following APIs to delete a **Preferences** instance or data file. 6. Observe data changes. - Specify an observer as the callback to subscribe to data changes for an application. When the value of the subscribed key is changed and the **flush()** method is executed, the observe callback will be invoked to return the change. + Specify an observer as the callback to subscribe to data changes for an application. When the value of the subscribed key is changed and saved by **flush()**, the observer callback will be invoked to return the new data. ```js var observer = function (key) { - console.info("The key of " + key + " changed.") + console.info("The key" + key + " changed."); } - preferences.on('change', observer) + preferences.on('change', observer); preferences.put('startup', 'auto', function (err) { if (err) { - console.info("Failed to put the value of startup with err: " + err) - return + console.info("Failed to put the value of 'startup'. Cause: " + err); + return; } - console.info("Put the value of startup successfully.") + console.info("Put the value of 'startup' successfully."); preferences.flush(function (err) { if (err) { - console.info("Failed to flush data to file with err: " + err) - return + console.info("Failed to flush data. Cause: " + err); + return; } - console.info("Flushed to file successfully.") // Observer will be called. + console.info("Flushed data successfully."); // The observer will be called. }) }) ``` 7. Delete the specified file. - Use the **deletePreferences** method to delete the **Preferences** singleton of the specified file from the memory, and delete the specified file, its backup file, and corrupted files. After the specified files are deleted, the application cannot use that instance to perform any data operation. Otherwise, data inconsistency will occur. The deleted data and files cannot be restored. + Use the **deletePreferences** method to delete the **Preferences** instance and its persistent file and backup and corrupted files. After the specified files are deleted, the application cannot use that instance to perform any data operation. Otherwise, data inconsistency will be caused. The deleted data and files cannot be restored. ```js - let proDelete = data_preferences.deletePreferences(context, 'mystore') + let proDelete = data_preferences.deletePreferences(context, 'mystore'); proDelete.then(() => { - console.info("Data deleted successfully.") + console.info("Deleted data successfully."); }).catch((err) => { - console.info("Failed to delete data with err: " + err) + console.info("Failed to delete data. Cause: " + err); }) ``` diff --git a/en/application-dev/database/database-preference-overview.md b/en/application-dev/database/database-preference-overview.md index b26943b610..144f97e5fe 100644 --- a/en/application-dev/database/database-preference-overview.md +++ b/en/application-dev/database/database-preference-overview.md @@ -1,29 +1,34 @@ # Preferences Overview -Preferences are used for access and persistence operations on the data in the key-value structure. When an application accesses a **Preferences** instance, the data in the instance will be cached in the memory for faster access. The cached data can also be written back to the text file for persistent storage. Since file read and write consume system resources, you are advised to minimize the frequency of reading and writing persistent files. +Preferences are used to implement quick access and persistence of the data in the `key-value` structure. + +After an application obtains a **Preferences** instance, the data in the instance will be cached in the memory for faster access. + +The cached data can also be written to a text file for persistent storage. Since file read and write consume system resources, you are advised to minimize the frequency of reading and writing files. + +You do not need to care about the implementation of the database lock mechanism. ## Basic Concepts -- **Key-value data structure** +- **Key-value structure** - A type of data structure. The key is the unique identifier for a piece of data, and the value is the specific data being identified. + A type of data structure. The `Key` is the unique identifier for a piece of data, and the `Value` is the specific data being identified. - **Non-relational database** - A database not in compliance with the atomicity, consistency, isolation, and durability (ACID) database management properties of relational data transactions. The data in a non-relational database is independent. + A database not in compliance with the atomicity, consistency, isolation, and durability (ACID) properties of relational data transactions. The data in a non-relational database is independent. The database that organizes data in the `key-value` structure is a non-relational database. ## Working Principles -When an application loads data from a **Preferences** file to a **Preferences** instance, the system stores the instance in the memory through a static container. Each file of an application or process has only one **Preferences** instance in the memory, till the application removes the instance from the memory or deletes the **Preferences** file. - -When obtaining a **Preferences** instance, the application can read data from or write data to the instance. The data in the instance can be flushed to its **Preferences** file by calling the **flush()** method. +1. An application can load data from a **Preferences** persistent file to a **Preferences** instance. The system stores the **Preferences** instance in the memory through a static container. Each file of an application or process has only one **Preferences** instance in the memory, till the application removes the instance from the memory or deletes the **Preferences** persistent file. +2. When obtaining a **Preferences** instance, the application can read data from or write data to the instance. The data in the `Preferences` instance can be flushed to its **Preferences** persistent file by calling the **flush()** method. -**Figure 1** How **Preferences** work +**Figure 1** Working mechanism ![](figures/preferences.png) ## Constraints - **Preferences** instances are loaded to the memory. To minimize non-memory overhead, the number of data records stored in a **Preferences** instance cannot exceed 10,000. Delete the instances that are no longer used in a timely manner. -- The key in key-value pairs is of the string type. It cannot be empty or exceed 80 bytes. -- The value of the string type in key-value pairs can be empty, but cannot exceed 8192 bytes if not empty. +- The `Key` in key-value pairs is of the string type. It cannot be empty or exceed 80 bytes. +- The `Value` of the string type in key-value pairs can be empty, but cannot exceed 8192 bytes if not empty. diff --git a/en/application-dev/database/figures/preferences.png b/en/application-dev/database/figures/preferences.png index ab91e2d4fb3019ca3f48a195041c9b19bdaec830..be3c6feef3c1f8d9da83e5d3c0065655bd07cb57 100644 GIT binary patch literal 35808 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 literal 33953 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, Array\, or Array\ type. +The **Preferences** module provides APIs for processing data in the form of key-value (KV) pairs and supports persistence of the KV pairs when required. + +The key is of the string type, and the value can be a number, a string, a Boolean value, or an array of numbers, strings, or Boolean values. > **NOTE**
+> > The initial APIs of this module are supported since API version 9. Newly added APIs will be marked with a superscript to indicate their earliest API version. ## Modules to Import -```ts +```js import data_preferences from '@ohos.data.preferences'; ``` @@ -17,36 +20,39 @@ import data_preferences from '@ohos.data.preferences'; **System capability**: SystemCapability.DistributedDataManager.Preferences.Core -| Name| Type| Readable| Writable| Description| -| -------- | -------- | -------- | -------- | -------- | -| MAX_KEY_LENGTH | string | Yes| No| Maximum length of a key. It must be less than 80 bytes.| -| MAX_VALUE_LENGTH | string | Yes| No| Maximum length of a value. It must be less than 8192 bytes.| +| Name | Type| Readable| Writable| Description | +| ---------------- | -------- | ---- | ---- | --------------------------------------- | +| MAX_KEY_LENGTH | string | Yes | No | Maximum length of a key. The key must be less than 80 bytes. | +| MAX_VALUE_LENGTH | string | Yes | No | Maximum length of a value. The value must be less than 8192 bytes.| ## data_preferences.getPreferences getPreferences(context: Context, name: string, callback: AsyncCallback<Preferences>): void -Reads a **Preferences** persistence file and loads data to the **Preferences** instance for data operations. This API uses an asynchronous callback to return the result. - +Obtains a **Preferences** instance. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | context | [Context](js-apis-ability-context.md) | Yes| Context of the application or function.| - | name | string | Yes| Name of the **Preferences** instance persistence file.| - | callback | AsyncCallback<[Preferences](#preferences)> | Yes| Callback used to return the result.| + +| Name | Type | Mandatory| Description | +| -------- | ------------------------------------------------ | ---- | ------------------------------------------------------------ | +| context | [Context](js-apis-ability-context.md) | Yes | Application context. | +| name | string | Yes | Name of the **Preferences** instance. | +| callback | AsyncCallback<[Preferences](#preferences)> | Yes | Callback invoked to return the result. If the operation is successful, **err** is **undefined** and **object** is the **Preferences** instance obtained. Otherwise, **err** is an error code.| **Example** -```ts -data_preferences.getPreferences(this.context, 'mystore', function (err, preferences) { + +```js +var preferences = null; +data_preferences.getPreferences(this.context, 'mystore', function (err, object) { if (err) { - console.info("Failed to get the preferences") + console.info("Failed to get the preferences. Cause: " + err); return; } - console.info("Got preferences successfully.") + preferences = object; + console.info("Got the preferences successfully."); }) ``` @@ -55,28 +61,31 @@ data_preferences.getPreferences(this.context, 'mystore', function (err, preferen getPreferences(context: Context, name: string): Promise<Preferences> -Reads a **Preferences** persistence file and loads data to the **Preferences** instance for data operations. This API uses a promise to return the result. +Obtains a **Preferences** instance. This API uses a promise to return the result. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | context | [Context](js-apis-ability-context.md) | Yes| Context of the application or function.| - | name | string | Yes| Name of the **Preferences** instance persistence file.| +| Name | Type | Mandatory| Description | +| ------- | ------------------------------------- | ---- | -------------------------- | +| context | [Context](js-apis-ability-context.md) | Yes | Application context. | +| name | string | Yes | Name of the **Preferences** instance.| **Return value** - | Type| Description| - | -------- | -------- | - | Promise<[Preferences](#preferences)> | Promise used to return the result.| +| Type | Description | +| ------------------------------------------ | ---------------------------------- | +| Promise<[Preferences](#preferences)> | Promise used to return the **Preferences** instance obtained.| **Example** -```ts + +```js +var preferences = null; let promise = data_preferences.getPreferences(this.context, 'mystore') -promise.then((preferences) => { - console.info("Got preferences successfully.") +promise.then((object) => { + preferences = object; + console.info("Got the preferences successfully."); }).catch((err) => { - console.info("Failed to get the preferences") + console.info("Failed to get the preferences. Cause: " + err); }) ``` @@ -85,26 +94,29 @@ promise.then((preferences) => { deletePreferences(context: Context, name: string, callback: AsyncCallback<void>): void -Deletes a **Preferences** singleton instance, the persistence file and backup file, and corrupted files from the memory. -Once a **Preferences** persistence file is deleted, the **Preferences** instance cannot be used for data operations. Otherwise, data inconsistency will occur. This API uses an asynchronous callback to return the result. +Deletes a **Preferences** instance from the memory. This API uses an asynchronous callback to return the result. + +If the **Preferences** instance has a persistent file, this API also deletes the persistent file. + +The deleted **Preferences** instance cannot be used for data operations. Otherwise, data inconsistency will be caused. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | context | [Context](js-apis-ability-context.md) | Yes| Context of the application or function.| - | name | string | Yes| Name of the **Preferences** instance persistence file.| - | callback | AsyncCallback<void> | Yes| Callback that returns no value.| +| Name | Type | Mandatory| Description | +| -------- | ------------------------------------- | ---- | ---------------------------------------------------- | +| context | [Context](js-apis-ability-context.md) | Yes | Application context. | +| name | string | Yes | Name of the **Preferences** instance to delete. | +| callback | AsyncCallback<void> | Yes | Callback invoked to return the result. If the operation is successful, **err** is **undefined**. Otherwise, **err** is an error code.| **Example** -```ts +```js data_preferences.deletePreferences(this.context, 'mystore', function (err) { if (err) { - console.info("Failed to delete data, err: " + err) + console.info("Failed to delete the preferences. Cause: " + err); return } - console.info("Deleted preferences successfully.") + console.info("Deleted the preferences successfully." ); }) ``` @@ -113,29 +125,32 @@ data_preferences.deletePreferences(this.context, 'mystore', function (err) { deletePreferences(context: Context, name: string): Promise<void> -Deletes a **Preferences** singleton instance, the persistence file and backup file, and corrupted files from the memory. -Once a **Preferences** persistence file is deleted, the **Preferences** instance cannot be used for data operations. Otherwise, data inconsistency will occur. This API uses a promise to return the result. +Deletes a **Preferences** instance from the memory. This API uses a promise to return the result. + +If the **Preferences** instance has a persistent file, this API also deletes the persistent file. + +The deleted **Preferences** instance cannot be used for data operations. Otherwise, data inconsistency will be caused. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | context | [Context](js-apis-ability-context.md) | Yes| Context of the application or function.| - | name | string | Yes| Name of the **Preferences** instance persistence file.| +| Name | Type | Mandatory| Description | +| ------- | ------------------------------------- | ---- | -------------------------- | +| context | [Context](js-apis-ability-context.md) | Yes | Application context. | +| name | string | Yes | Name of the **Preferences** instance to delete.| **Return value** - | Type| Description| - | -------- | -------- | - | Promise<void> | Promise that returns no value.| +| Type | Description | +| ------------------- | ------------------------- | +| Promise<void> | Promise that returns no value.| **Example** -```ts +```js let promise = data_preferences.deletePreferences(this.context, 'mystore') promise.then(() => { - console.info("Deleted preferences successfully.") + console.info("Deleted the preferences successfully."); }).catch((err) => { - console.info("Failed to delete preferences, err: " + err) + console.info("Failed to delete the preferences. Cause: " + err); }) ``` @@ -144,27 +159,27 @@ promise.then(() => { removePreferencesFromCache(context: Context, name: string, callback: AsyncCallback<void>): void -Removes a **Preferences** singleton instance from the memory. +Removes a **Preferences** instance from the memory. This API uses an asynchronous callback to return the result. -When a **Preferences** singleton instance is removed, this instance cannot be used for data operations. Otherwise, data inconsistency will occur. This API uses an asynchronous callback to return the result. +The removed **Preferences** instance cannot be used for data operations. Otherwise, data inconsistency will be caused. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | context | [Context](js-apis-ability-context.md) | Yes| Context of the application or function.| - | name | string | Yes| Name of the **Preferences** instance persistence file.| - | callback | AsyncCallback<void> | Yes| Callback that returns no value.| +| Name | Type | Mandatory| Description | +| -------- | ------------------------------------- | ---- | ---------------------------------------------------- | +| context | [Context](js-apis-ability-context.md) | Yes | Application context. | +| name | string | Yes | Name of the **Preferences** instance to remove. | +| callback | AsyncCallback<void> | Yes | Callback invoked to return the result. If the operation is successful, **err** is **undefined**. Otherwise, **err** is an error code.| **Example** -```ts +```js data_preferences.removePreferencesFromCache(this.context, 'mystore', function (err) { if (err) { - console.info("Failed to remove preferences from cache, err: " + err) - return + console.info("Failed to remove the preferences. Cause: " + err); + return; } - console.info("Removed preferences from cache successfully.") + console.info("Removed the preferences successfully."); }) ``` @@ -173,62 +188,65 @@ data_preferences.removePreferencesFromCache(this.context, 'mystore', function (e removePreferencesFromCache(context: Context, name: string): Promise<void> -Removes a **Preferences** singleton instance from the memory. +Removes a **Preferences** instance from the memory. This API uses a promise to return the result. -When a **Preferences** singleton instance is removed, this instance cannot be used for data operations. Otherwise, data inconsistency will occur. This API uses a promise to return the execution result. +The removed **Preferences** instance cannot be used for data operations. Otherwise, data inconsistency will be caused. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | context | [Context](js-apis-ability-context.md) | Yes| Context of the application or function.| - | name | string | Yes| Name of the **Preferences** instance persistence file.| +| Name | Type | Mandatory| Description | +| ------- | ------------------------------------- | ---- | -------------------------- | +| context | [Context](js-apis-ability-context.md) | Yes | Application context. | +| name | string | Yes | Name of the **Preferences** instance to remove.| **Return value** - | Type| Description| - | -------- | -------- | - | Promise<void> | Promise that returns no value.| +| Type | Description | +| ------------------- | ------------------------- | +| Promise<void> | Promise that returns no value.| **Example** -```ts +```js let promise = data_preferences.removePreferencesFromCache(this.context, 'mystore') promise.then(() => { - console.info("Removed preferences from cache successfully.") + console.info("Removed the preferences successfully."); }).catch((err) => { - console.info("Failed to remove preferences from cache, err: " + err) + console.info("Failed to remove the preferences. Cause: " + err); }) ``` ## Preferences -Provides APIs for obtaining and modifying storage data. +Provides methods for obtaining and modifying data. + +Before calling any method of **Preferences**, you must obtain a **Preferences** instance by using [data_preferences.getPreferences](#data_preferencesgetpreferences). ### get get(key: string, defValue: ValueType, callback: AsyncCallback<ValueType>): void -Obtains the value of a key. If the value is null or a non-default value, the default data is returned. This API uses an asynchronous callback to return the result. +Obtains the value of a key. This API uses an asynchronous callback to return the result. If the value is **null** or is not the type of the default value, the default value is returned. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** -| Name| Type| Mandatory| Description| -| -------- | -------- | -------- | -------- | -| key | string | Yes| Key of the data to obtain. It cannot be empty.| -| defValue | [ValueType](#valuetype) | Yes| Default value to be returned. It can be a number, a string, a Boolean value, an array of numbers, an array of strings, or a Boolean array. -| callback | AsyncCallback<ValueType> | Yes| Callback used to return the result.| +| Name | Type | Mandatory| Description | +| -------- | -------------------------------------------- | ---- | ------------------------------------------------------------ | +| key | string | Yes | Key of the data to obtain. It cannot be empty. | +| defValue | [ValueType](#valuetype) | Yes | Default value to be returned. The value can be a number, a string, a Boolean value, or an array of numbers, strings, or Boolean values.| +| callback | AsyncCallback<[ValueType](#valuetype)> | Yes | Callback invoked to return the result. If the operation is successful, **err** is** undefined** and **data** is the value obtained. Otherwise, **err** is an error code.| **Example** -```ts -preferences.get('startup', 'default', function(err, value) { + +```js +preferences.get('startup', 'default', function(err, data) { if (err) { - console.info("Failed to get the value of startup, err: " + err) - return + console.info("Failed to get the value of 'startup'. Cause: " + err); + return; } - console.info("The value of startup is " + value) + console.info("Got the value of 'startup'. Data: " + data); }) ``` @@ -237,28 +255,29 @@ preferences.get('startup', 'default', function(err, value) { get(key: string, defValue: ValueType): Promise<ValueType> -Obtains the value of a key. If the value is null or a non-default value, the default data is returned. This API uses a promise to return the result. +Obtains the value of a key. This API uses a promise to return the result. If the value is **null** or is not the type of the default value, the default value is returned. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core -- **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | key | string | Yes| Key of the data to obtain. It cannot be empty.| - | defValue | [ValueType](#valuetype) | Yes| Default value to be returned. It can be a number, a string, a Boolean value, an array of numbers, an array of strings, or a Boolean array. + **Parameters** +| Name | Type | Mandatory| Description | +| -------- | ----------------------- | ---- | ------------------------------------------------------------ | +| key | string | Yes | Key of the data to obtain. It cannot be empty. | +| defValue | [ValueType](#valuetype) | Yes | Default value to be returned. The value can be a number, a string, a Boolean value, or an array of numbers, strings, or Boolean values.| **Return value** - | Type| Description| - | -------- | -------- | - | Promise<ValueType> | Promise used to return the result.| + +| Type | Description | +| ----------------------------------- | ----------------------------- | +| Promise<[ValueType](#valuetype)> | Promise used to return the value obtained.| **Example** -```ts -let promise = preferences.get('startup', 'default') -promise.then((value) => { - console.info("The value of startup is " + value) +```js +let promise = preferences.get('startup', 'default'); +promise.then((data) => { + console.info("Got the value of 'startup'. Data: " + data); }).catch((err) => { - console.info("Failed to get the value of startup, err: " + err) + console.info("Failed to get the value of 'startup'. Cause: " + err); }) ``` @@ -266,25 +285,26 @@ promise.then((value) => { getAll(callback: AsyncCallback<Object>): void; -Obtains the **Object** instance that contains all KV pairs. +Obtains an **Object** instance that contains all KV pairs. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | callback | AsyncCallback<Object> | Yes| Callback used to return the **Object** instance obtained.| +| Name | Type | Mandatory| Description | +| -------- | --------------------------- | ---- | ------------------------------------------------------------ | +| callback | AsyncCallback<Object> | Yes | Callback invoked to return the result. If the operation is successful, **err** is **undefined** and **value** is the **Object** instance obtained. Otherwise, **err** is an error code.| **Example** -```ts + +```js preferences.getAll(function (err, value) { if (err) { - console.info("getAll failed, err: " + err) - return + console.info("Failed to get all KV pairs. Cause: " + err); + return; } - let keys = Object.keys(value) - console.info('getAll keys = ' + keys) - console.info("getAll object = " + JSON.stringify(value)) + let allKeys = Object.keys(value); + console.info("getAll keys = " + allKeys); + console.info("getAll object = " + JSON.stringify(value)); }); ``` @@ -293,24 +313,24 @@ preferences.getAll(function (err, value) { getAll(): Promise<Object> -Obtains the **Object** instance that contains all KV pairs. +Obtains an **Object** instance that contains all KV pairs. This API uses a promise to return the result. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Return value** - | Type| Description| - | -------- | -------- | - | Promise<Object> | Promise used to return the **Object** instance obtained.| +| Type | Description | +| --------------------- | ------------------------------------------- | +| Promise<Object> | Promise used to return the **Object** instance obtained.| **Example** -```ts -let promise = preferences.getAll() +```js +let promise = preferences.getAll(); promise.then((value) => { - let keys = Object.keys(value) - console.info('getAll keys = ' + keys) - console.info("getAll object = " + JSON.stringify(value)) + let allKeys = Object.keys(value); + console.info('getAll keys = ' + allKeys); + console.info("getAll object = " + JSON.stringify(value)); }).catch((err) => { - console.info("getAll failed, err: " + err) + console.info("Failed to get all KV pairs. Cause: " + err); }) ``` @@ -318,25 +338,25 @@ promise.then((value) => { put(key: string, value: ValueType, callback: AsyncCallback<void>): void -Puts a new value to this **Preferences** instance and its persistence file. This API uses an asynchronous callback to return the result. +Writes data to this **Preferences** instance. This API uses an asynchronous callback to return the result. You can use [flush](#flush) to make the **Preferences** instance persistent. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | key | string | Yes| Key of the data. It cannot be empty.| - | value | [ValueType](#valuetype) | Yes| New value to store. It can be a number, a string, a Boolean value, an array of numbers, an array of strings, or a Boolean array.| - | callback | AsyncCallback<void> | Yes| Callback that returns no value.| +| Name | Type | Mandatory| Description | +| -------- | ------------------------- | ---- | ------------------------------------------------------------ | +| key | string | Yes | Key of the data. It cannot be empty. | +| value | [ValueType](#valuetype) | Yes | Value to write. The value can be a number, a string, a Boolean value, or an array of numbers, strings, or Boolean values.| +| callback | AsyncCallback<void> | Yes | Callback invoked to return the result. If the operation is successful, **err** is undefined. Otherwise, **err** is an error code. | **Example** -```ts +```js preferences.put('startup', 'auto', function (err) { if (err) { - console.info("Failed to put the value of startup, err: " + err) - return + console.info("Failed to put the value of 'startup'. Cause: " + err); + return; } - console.info("Put the value of startup successfully.") + console.info("Put the value of 'startup' successfully."); }) ``` @@ -345,28 +365,28 @@ preferences.put('startup', 'auto', function (err) { put(key: string, value: ValueType): Promise<void> -Puts a new value to this **Preferences** instance and its persistence file. This API uses a promise to return the result. +Writes data to this **Preferences** instance. This API uses a promise to return the result. You can use [flush](#flush) to make the **Preferences** instance persistent. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | key | string | Yes| Key of the data. It cannot be empty.| - | value | [ValueType](#valuetype) | Yes| New value to store. It can be a number, a string, a Boolean value, an array of numbers, an array of strings, or a Boolean array.| +| Name| Type | Mandatory| Description | +| ------ | ----------------------- | ---- | ------------------------------------------------------------ | +| key | string | Yes | Key of the data. It cannot be empty. | +| value | [ValueType](#valuetype) | Yes | Value to write. The value can be a number, a string, a Boolean value, or an array of numbers, strings, or Boolean values.| **Return value** - | Type| Description| - | -------- | -------- | - | Promise<void> | Promise that returns no value.| +| Type | Description | +| ------------------- | ------------------------- | +| Promise<void> | Promise that returns no value.| **Example** -```ts -let promise = preferences.put('startup', 'auto') +```js +let promise = preferences.put('startup', 'auto'); promise.then(() => { - console.info("Put the value of startup successfully.") + console.info("Put the value of 'startup' successfully."); }).catch((err) => { - console.info("Failed to put the value of startup, err: " + err) + console.info("Failed to put the value of 'startup'. Cause: " + err); }) ``` @@ -375,27 +395,27 @@ promise.then(() => { has(key: string, callback: AsyncCallback<boolean>): void -Checks whether this **Preferences** instance contains data with a given key. This API uses an asynchronous callback to return the result. +Checks whether this **Preferences** instance contains a KV pair of the given key. This API uses an asynchronous callback to return the result.. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | key | string | Yes| Key of the data to check. It cannot be empty.| - | callback | AsyncCallback<boolean> | Yes| Callback used to return the result. It returns **true** if the **Preferences** instance contains data with the given key and returns **false** otherwise.| +| Name | Type | Mandatory| Description | +| -------- | ---------------------------- | ---- | ------------------------------------------------------------ | +| key | string | Yes | Key of the data to check. It cannot be empty. | +| callback | AsyncCallback<boolean> | Yes | Callback invoked to return the result. If the **Preferences** instance contains the KV pair, **true** will be returned. Otherwise, **false** will be returned.| **Example** -```ts +```js preferences.has('startup', function (err, isExist) { if (err) { - console.info("Failed to check the key of startup, err: " + err) - return + console.info("Failed to check the key 'startup'. Cause: " + err); + return; } if (isExist) { - console.info("The key of startup is contained.") + console.info("The key 'startup' is contained."); } else { - console.info("The key of startup is not contained.") + console.info("The key 'startup' is not contained."); } }) ``` @@ -405,31 +425,32 @@ preferences.has('startup', function (err, isExist) { has(key: string): Promise<boolean> -Checks whether this **Preferences** instance contains data with a given key. This API uses a promise to return the result. +Checks whether this **Preferences** instance contains data with the given key. This API uses a promise to return the result. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | key | string | Yes| Key of the data to check. It cannot be empty.| +| Name| Type | Mandatory| Description | +| ------ | ------ | ---- | ------------------------------- | +| key | string | Yes | Key of the data to check. It cannot be empty.| **Return value** - | Type| Description| - | -------- | -------- | - | Promise<boolean> | Promise used to return the result. It returns **true** if the **Preferences** instance contains data with the given key and returns **false** otherwise.| +| Type | Description | +| ---------------------- | ------------------------------------------------------------ | +| Promise<boolean> | Promise used to return the result. If the **Preferences** instance contains the KV pair, **true** will be returned. Otherwise, **false** will be returned.| **Example** -```ts -let promise = preferences.has('startup') + +```js +let promise = preferences.has('startup'); promise.then((isExist) => { if (isExist) { - console.info("The key of startup is contained.") + console.info("The key 'startup' is contained."); } else { - console.info("The key of startup is not contained.") + console.info("The key 'startup' is not contained."); } }).catch((err) => { - console.info("Failed to check the key of startup, err: " + err) + console.info("Failed to check the key 'startup'. Cause: " + err); }) ``` @@ -438,24 +459,24 @@ promise.then((isExist) => { delete(key: string, callback: AsyncCallback<void>): void -Deletes a KV pair of the specified key from this **Preferences** instance. This API uses an asynchronous callback to return the result. +Deletes a KV pair from this **Preferences** instance. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | key | string | Yes| Key of the KV pair to delete. It cannot be empty.| - | callback | AsyncCallback<void> | Yes| Callback that returns no value.| +| Name | Type | Mandatory| Description | +| -------- | ------------------------- | ---- | ---------------------------------------------------- | +| key | string | Yes | Key of the KV pair to delete. It cannot be empty. | +| callback | AsyncCallback<void> | Yes | Callback invoked to return the result. If the operation is successful, **err** is **undefined**. Otherwise, **err** is an error code.| **Example** -```ts +```js preferences.delete('startup', function (err) { if (err) { - console.info("Failed to delete startup key, err: " + err) - return + console.info("Failed to delete the key 'startup'. Cause: " + err); + return; } - console.info("Deleted startup key successfully.") + console.info("Deleted the key 'startup'."); }) ``` @@ -464,27 +485,27 @@ preferences.delete('startup', function (err) { delete(key: string): Promise<void> -Deletes a KV pair of the specified key from this **Preferences** instance. This API uses a promise to return the result. +Deletes a KV pair from this **Preferences** instance. This API uses a promise to return the result. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | key | string | Yes| Key of the KV pair to delete. It cannot be empty.| +| Name| Type | Mandatory| Description | +| ------ | ------ | ---- | ------------------------------- | +| key | string | Yes | Key of the KV pair to delete. It cannot be empty.| **Return value** - | Type| Description| - | -------- | -------- | - | Promise<void> | Promise that returns no value.| +| Type | Description | +| ------------------- | ------------------------- | +| Promise<void> | Promise that returns no value.| **Example** -```ts -let promise = preferences.delete('startup') +```js +let promise = preferences.delete('startup'); promise.then(() => { - console.info("Deleted startup key successfully.") + console.info("Deleted the key 'startup'."); }).catch((err) => { - console.info("Failed to delete startup key, err: " + err) + console.info("Failed to delete the key 'startup'. Cause: " + err); }) ``` @@ -493,23 +514,23 @@ promise.then(() => { flush(callback: AsyncCallback<void>): void -Saves the modification to this **Preferences** instance and synchronizes the modification to the **Preferences** persistence file. This API uses an asynchronous callback to return the result. +Saves the data of the **Preferences** instance to a file asynchronously. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | callback | AsyncCallback<void> | Yes| Callback that returns no value.| +| Name | Type | Mandatory| Description | +| -------- | ------------------------- | ---- | ---------------------------------------------------- | +| callback | AsyncCallback<void> | Yes | Callback invoked to return the result. If the operation is successful, **err** is **undefined**. Otherwise, **err** is an error code.| **Example** -```ts +```js preferences.flush(function (err) { if (err) { - console.info("Failed to flush data to file, err: " + err) - return + console.info("Failed to flush data. Cause: " + err); + return; } - console.info("Flushed data to file successfully.") + console.info("Flushed data successfully."); }) ``` @@ -518,22 +539,22 @@ preferences.flush(function (err) { flush(): Promise<void> -Saves the modification to this **Preferences** instance and synchronizes the modification to the **Preferences** persistence file. This API uses a promise to return the result. +Saves the data of the **Preferences** instance to a file asynchronously. This API uses a promise to return the result. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Return value** - | Type| Description| - | -------- | -------- | - | Promise<void> | Promise that returns no value.| +| Type | Description | +| ------------------- | ------------------------- | +| Promise<void> | Promise that returns no value.| **Example** -```ts -let promise = preferences.flush() +```js +let promise = preferences.flush(); promise.then(() => { console.info("Flushed data to file successfully.") }).catch((err) => { - console.info("Failed to flush data to file, err: " + err) + console.info("Failed to flush data. Cause: " + err); }) ``` @@ -542,23 +563,23 @@ promise.then(() => { clear(callback: AsyncCallback<void>): void -Clears data of this **Preferences** instance. This API uses an asynchronous callback to return the result. +Clears this **Preferences** instance. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | callback | AsyncCallback<void> | Yes| Callback that returns no value.| +| Name | Type | Mandatory| Description | +| -------- | ------------------------- | ---- | ---------------------------------------------------- | +| callback | AsyncCallback<void> | Yes | Callback invoked to return the result. If the operation is successful, **err** is **undefined**. Otherwise, **err** is an error code.| **Example** -```ts +```js preferences.clear(function (err) { if (err) { - console.info("Failed to clear data, err: " + err) - return + console.info("Failed to clear data. Cause: " + err); + return; } - console.info("Cleared to file successfully.") + console.info("Cleared data successfully."); }) ``` @@ -567,22 +588,22 @@ preferences.clear(function (err) { clear(): Promise<void> -Clears data of this **Preferences** instance. This API uses a promise to return the result. +Clears this **Preferences** instance. This API uses a promise to return the result. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Return value** - | Type| Description| - | -------- | -------- | - | Promise<void> | Promise that returns no value.| +| Type | Description | +| ------------------- | ------------------------- | +| Promise<void> | Promise that returns no value.| **Example** -```ts +```js let promise = preferences.clear() promise.then(() => { - console.info("Cleared to file successfully.") + console.info("Cleared data successfully."); }).catch((err) => { - console.info("Failed to clear data, err: " + err) + console.info("Failed to clear data. Cause: " + err); }) ``` @@ -591,40 +612,40 @@ promise.then(() => { on(type: 'change', callback: Callback<{ key : string }>): void -Subscribes to data changes. When the value of the subscribed key changes, a callback will be invoked after **flush()** is executed. +Subscribes to data changes. A callback will be triggered to return the new value if the value of the subscribed key is changed and [flushed](#flush). **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | type | string | Yes| Event type. The value **change** indicates data change events.| - | callback | Callback<{ key : string }> | Yes| Callback used to return data changes.| +| Name | Type | Mandatory| Description | +| -------- | -------------------------------- | ---- | ---------------------------------------- | +| type | string | Yes | Event type to subscribe to. The value **change** indicates data change events.| +| callback | Callback<{ key : string }> | Yes | Callback invoked to return data changes. | **Example** -```ts +```js data_preferences.getPreferences(this.context, 'mystore', function (err, preferences) { if (err) { - console.info("Failed to get preferences.") + console.info("Failed to get the preferences."); return; } var observer = function (key) { - console.info("The key of " + key + " changed.") + console.info("The key " + key + " changed."); } - preferences.on('change', observer) + preferences.on('change', observer); preferences.put('startup', 'auto', function (err) { if (err) { - console.info("Failed to put the value of startup, err: " + err) - return + console.info("Failed to put the value of 'startup'. Cause: " + err); + return; } - console.info("Put the value of startup successfully.") + console.info("Put the value of 'startup' successfully."); preferences.flush(function (err) { if (err) { - console.info("Failed to flush data to file, err: " + err) - return + console.info("Failed to flush data. Cause: " + err); + return; } - console.info("Flushed data to file successfully.") // The observer will be called. + console.info("Flushed data successfully."); // The observer will be called. }) }) }) @@ -640,37 +661,37 @@ Unsubscribes from data changes. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core **Parameters** - | Name| Type| Mandatory| Description| - | -------- | -------- | -------- | -------- | - | type | string | Yes| Event type. The value **change** indicates data change events.| - | callback | Callback<{ key : string }> | No| Callback used to return data changes. If this parameter is left empty, all callbacks for data changes will be canceled.| +| Name | Type | Mandatory| Description | +| -------- | -------------------------------- | ---- | ------------------------------------------ | +| type | string | Yes | Event type to unsubscribe from. The value **change** indicates data change events. | +| callback | Callback<{ key : string }> | No | Callback to unregister. If this parameter is left blank, the callbacks used to subscribing to all data changes will be unregistered.| **Example** -```ts +```js data_preferences.getPreferences(this.context, 'mystore', function (err, preferences) { if (err) { - console.info("Failed to get preferences.") + console.info("Failed to get preferences."); return; } var observer = function (key) { - console.info("The key of " + key + " changed.") + console.info("The key " + key + " changed."); } - preferences.on('change', observer) + preferences.on('change', observer); preferences.put('startup', 'auto', function (err) { if (err) { - console.info("Failed to put the value of startup, err: " + err) - return + console.info("Failed to put the value of 'startup'. Cause: " + err); + return; } - console.info("Put the value of startup successfully.") + console.info("Put the value of 'startup' successfully."); preferences.flush(function (err) { if (err) { - console.info("Failed to flush data to file, err: " + err) - return + console.info("Failed to flush data. Cause: " + err); + return; } - console.info("Flushed data to file successfully.") // The observer will be called. + console.info("Flushed data successfully."); // The observer will be called. }) - preferences.off('change', observer) + preferences.off('change', observer); }) }) ``` @@ -681,11 +702,11 @@ Enumerates the value types. **System capability**: SystemCapability.DistributedDataManager.Preferences.Core -| Type | Description | -| -------------- | ------------------------------ | -| number | The value is a number. | -| string | The value is a string. | -| boolean | The value is of Boolean type. | +| Type | Description | +| --------------- | ------------------------------ | +| number | The value is a number. | +| string | The value is a string. | +| boolean | The value is of Boolean type. | | Array\ | The value is an array of numbers. | | Array\ | The value is a Boolean array. | | Array\ | The value is an array of the strings.| -- GitLab