1. 介绍 轻量级偏好数据库是轻量级存储,主要用于保存应用的一些常用配置。它是使用键值对的形式来存储数据的,保存数据时,需要给这条数据提供一个键,读取数据时再通过这个键把对应的值取出来。
说明
轻量级偏好数据库值的存储数据类型包括整型、长整型、浮点型、布尔型、字符串型、字符串型Set集合。数据存储在本地文件中,同时也加载在内存中,不适合需要存储大量数据和频繁改变数据的场景,建议存储的数据不超过一万条。
轻量级偏好数据库能力详细介绍可参考轻量级偏好数据库。
2. 搭建HarmonyOS环境
我们首先需要完成HarmonyOS开发环境搭建,可参照如下步骤进行。
- 安装DevEco Studio,详情请参考下载和安装软件。
- 设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:
- 如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。
- 如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境。
- 开发者可以参考以下链接,完成设备调试的相关配置:
3. 创建数据库
创建数据库使用数据库操作的辅助类DatabaseHelper,通过DatabaseHelper的getPreferences(String name)方法可以获取到对应文件名的Preferences实例,再通过Preferences提供的方法进行数据库的相关操作。
DatabaseHelper的构造需要传入context,Ability和AbilitySlice都实现了ohos.app.Context接口。因此可以从应用中的Ability或AbilitySlice调用getContext()方法来获得context。
Preferences的数据存储在文件中,因此需要指定存储的文件名,其取值不能为空,也不能包含路径,默认存储目录可以通过Context.getPreferencesDir()获取。
- DatabaseHelper databaseHelper = new DatabaseHelper(context);
- String filename = "pdb";
- Preferences preferences = databaseHelper.getPreferences(filename);
复制代码
4. 写入数据
通过Preferences的putString(String var1, String var2)和putInt(String var1, int var2)方法可以将数据写入Preferences实例,通过flush()或者flushSync()将Preferences实例持久化。
flush()会立即更改内存中的Preferences对象,但会将更新异步写入磁盘。flushSync()更改内存中的数据的同时会将数据同步写入磁盘。由于flushSync()是同步的,建议不要从主线程调用它,以避免界面卡顿。
- preferences.putString("fruit",fruit);
- preferences.putInt("number",number);
- preferences.flush();
复制代码
5. 读取数据
通过Preferences的getString(String var1, String var2)和getInt(String var1, int var2)方法传入键来获取对应的值;如果键不存在,则返回默认值。
例如获取上述fruit和number键的值,如果fruit和number键不存在,则会分别返回""和0值。通过默认值的设置,来避免程序出现异常。
- String fruit = preferences.getString("fruit", "");
- int number = preferences.getInt("number", 0);
复制代码
6. 删除数据库
通过DatabaseHelper的deletePreferences(String name)方法删除指定文件。
删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。以删除上述名称为"pdb"的文件为例。
- databaseHelper.deletePreferences(filename);
复制代码
说明
轻量级偏好数据库支持数据库文件的创建、移动,数据的查询、插入、删除,以及支持注册观察者来观察数据是否发生变化。详细信息可参考轻量级偏好数据库。
7. 恭喜你
通过本教程的学习,你已学会如何使用轻量级偏好数据库。
8. 完整示例
下面我们通过一个完整的示例来看下轻量级偏好数据库的使用。本示例可以让用户输入水果名称和数量,并实现数据的写入和读取,以及删除数据文件,实现效果如下。
首先在HUAWEI DevEco Studio创建一个Phone的Empty Feature Ability(Java)模板工程,然后在生成的布局文件"resources/base/layout/ability_main.xml"中增加如下代码:
- 添加2个Text用来显示"Fruit"和"Number"。
- 添加2个TextField使得用户可以输入"Fruit"和"Number"的信息。
- 添加3个Button分别进行写入数据,读取数据和删除数据库。
继续在"resources/base/graphic/"目录下增加如下文件:
1.text_element.xml文件用来定义Text和TextField背景属性。
- <?xml version="1.0" encoding="UTF-8" ?>
- <shape xmlns:ohos="http://schemas.huawei.com/res/ohos"
- ohos:shape="rectangle">
- <solid
- ohos:color="#FFFFFF"/>
- </shape>
复制代码2.button_element.xml文件用来定义Button背景属性。
- <?xml version="1.0" encoding="utf-8"?>
- <shape xmlns:ohos="http://schemas.huawei.com/res/ohos"
- ohos:shape="rectangle">
- <corners
- ohos:radius="6vp"/>
- <solid
- ohos:color="#70DBDB"/>
- </shape>
复制代码
然后在"slice/MainAblitySlice"中添加如下代码:
- 在onStart()方法中设置需要创建的数据库文件名,并创建数据库实例。
- 在btnWrite()方法中,设置write_btn的点击事件回调,点击写入数据,并用ToastDialog提示写入成功。
- 在btnRead()方法中,设置read_btn的点击事件回调,点击读取数据,并用ToastDialog展示读取的内容。
- 在btnDelete()方法中,设置delete_btn的点击事件回调,点击进行数据库文件的删除,并用ToastDialog提示删除成功。
- import ohos.aafwk.ability.AbilitySlice;
- import ohos.aafwk.content.Intent;
- import ohos.agp.components.Button;
- import ohos.agp.components.Component;
- import ohos.agp.components.TextField;
- import ohos.agp.window.dialog.ToastDialog;
- import ohos.app.Context;
- import ohos.data.DatabaseHelper;
- import ohos.data.preferences.Preferences;
-
- import java.util.Locale;
-
- public class MainAbilitySlice extends AbilitySlice {
- private Context context;
- private Button btnWrite;
- private Button btnRead;
- private Button btnDelete;
- private TextField textFiledFruit;
- private TextField textFiledNumber;
- private String filename;
- private Preferences preferences;
- private DatabaseHelper databaseHelper;
-
- [url=home.php?mod=space&uid=2735960]@Override[/url]
- public void onStart(Intent intent) {
- super.onStart(intent);
- super.setUIContent(ResourceTable.Layout_ability_main);
- context = getContext();
- btnWrite = (Button) findComponentById(ResourceTable.Id_write_btn);
- btnRead = (Button) findComponentById(ResourceTable.Id_read_btn);
- btnDelete = (Button) findComponentById(ResourceTable.Id_delete_btn);
- textFiledFruit = (TextField) findComponentById(ResourceTable.Id_text_fruit);
- textFiledNumber = (TextField) findComponentById(ResourceTable.Id_text_number);
- databaseHelper = new DatabaseHelper(context);
- filename = "pdb";
- preferences = databaseHelper.getPreferences(filename);
- btnWrite();
- btnRead();
- btnDelete();
- }
-
- private void btnWrite() {
- btnWrite.setClickedListener(new Component.ClickedListener() {
- @Override
- public void onClick(Component component) {
- String fruit = textFiledFruit.getText();
- try {
- int number = Integer.parseInt(textFiledNumber.getText());
- preferences.putInt("number",number);
- preferences.putString("fruit",fruit);
- preferences.flush();
- new ToastDialog(context).setText("Write to DB file success").show();
- } catch (NumberFormatException e) {
- new ToastDialog(context).setText("Please input number in Number row").show();
- }
- }
- });
- }
-
- private void btnRead() {
- btnRead.setClickedListener(new Component.ClickedListener() {
- @Override
- public void onClick(Component component) {
- String string = String.format(Locale.ENGLISH,"Fruit: %s,Number: %d",
- preferences.getString("fruit", ""),preferences.getInt("number", 0));
- new ToastDialog(context).setText(string).show();
- }
- });
- }
-
- private void btnDelete() {
- btnDelete.setClickedListener(new Component.ClickedListener() {
- @Override
- public void onClick(Component component) {
- if (databaseHelper.deletePreferences(filename)) {
- preferences.clear();
- new ToastDialog(context).setText("Delete DB file success").show();
- } else {
- new ToastDialog(context).setText("Delete DB file failed").show();
- }
- }
- });
- }
- }
复制代码
说明
以上代码仅demo演示参考使用,产品化的代码需要考虑数据校验和国际化。