[文章]基于轻量级偏好数据库,实现存储在本地应用数据的访问及操作

阅读量0
0
4
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()获取。
  1. DatabaseHelper databaseHelper = new DatabaseHelper(context);  
  2. String filename = "pdb";  
  3. 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()是同步的,建议不要从主线程调用它,以避免界面卡顿。
  1. preferences.putString("fruit",fruit);
  2. preferences.putInt("number",number);
  3. preferences.flush();
复制代码
  
5. 读取数据      
通过Preferences的getString(String var1, String var2)和getInt(String var1, int var2)方法传入键来获取对应的值;如果键不存在,则返回默认值。

例如获取上述fruit和number键的值,如果fruit和number键不存在,则会分别返回""和0值。通过默认值的设置,来避免程序出现异常。
  1. String fruit = preferences.getString("fruit", "");
  2. int number = preferences.getInt("number", 0);
复制代码
  
6. 删除数据库      
通过DatabaseHelper的deletePreferences(String name)方法删除指定文件。

删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。以删除上述名称为"pdb"的文件为例。
  1. 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分别进行写入数据,读取数据和删除数据库。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <DirectionalLayout
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos"
  4.     ohos:height="match_parent"
  5.     ohos:width="match_parent"
  6.     ohos:orientation="vertical">
  7.   
  8.     <Text
  9.         ohos:id="$+id:text_fruit_tag"
  10.         ohos:height="35vp"
  11.         ohos:width="match_parent"
  12.         ohos:background_element="$graphic:text_element"
  13.         ohos:layout_alignment="left"
  14.         ohos:text="Fruit"
  15.         ohos:text_size="85"
  16.         ohos:right_margin="20vp"
  17.         ohos:left_margin="20vp"
  18.         ohos:text_color="#000000"
  19.         ohos:top_margin="25vp"
  20.         />
  21.   
  22.     <TextField
  23.         ohos:id="$+id:text_fruit"
  24.         ohos:height="35vp"
  25.         ohos:width="match_parent"
  26.         ohos:background_element="$graphic:text_element"
  27.         ohos:layout_alignment="left"
  28.         ohos:text="Orange"
  29.         ohos:text_size="50"
  30.         ohos:right_margin="20vp"
  31.         ohos:left_margin="20vp"
  32.         ohos:text_color="#000000"
  33.         ohos:top_margin="25vp"
  34.         ohos:basement="#000099"
  35.         />
  36.   
  37.     <Text
  38.         ohos:id="$+id:text_number_tag"
  39.         ohos:height="35vp"
  40.         ohos:width="match_parent"
  41.         ohos:background_element="$graphic:text_element"
  42.         ohos:layout_alignment="left"
  43.         ohos:text="Number"
  44.         ohos:text_size="85"
  45.         ohos:right_margin="20vp"
  46.         ohos:left_margin="20vp"
  47.         ohos:text_color="#000000"
  48.         ohos:top_margin="25vp"
  49.         />
  50.   
  51.     <TextField
  52.         ohos:id="$+id:text_number"
  53.         ohos:height="35vp"
  54.         ohos:width="match_parent"
  55.         ohos:background_element="$graphic:text_element"
  56.         ohos:layout_alignment="left"
  57.         ohos:text="25"
  58.         ohos:text_size="50"
  59.         ohos:right_margin="20vp"
  60.         ohos:left_margin="20vp"
  61.         ohos:text_color="#000000"
  62.         ohos:top_margin="25vp"
  63.         ohos:basement="#000099"
  64.         />
  65.   
  66.     <Button
  67.         ohos:id="$+id:write_btn"
  68.         ohos:width="match_parent"
  69.         ohos:height="35vp"
  70.         ohos:text="Write DB"
  71.         ohos:background_element="$graphic:button_element"
  72.         ohos:text_size="50"
  73.         ohos:text_color="#FFFFFF"
  74.         ohos:top_margin="25vp"
  75.         ohos:right_margin="20vp"
  76.         ohos:left_margin="20vp"
  77.         />
  78.   
  79.     <Button
  80.         ohos:id="$+id:read_btn"
  81.         ohos:width="match_parent"
  82.         ohos:height="35vp"
  83.         ohos:text="Read DB"
  84.         ohos:background_element="$graphic:button_element"
  85.         ohos:text_size="50"
  86.         ohos:text_color="#FFFFFF"
  87.         ohos:top_margin="25vp"
  88.         ohos:right_margin="20vp"
  89.         ohos:left_margin="20vp"
  90.         />
  91.   
  92.     <Button
  93.         ohos:id="$+id:delete_btn"
  94.         ohos:width="match_parent"
  95.         ohos:height="35vp"
  96.         ohos:text="Delete DB File"
  97.         ohos:background_element="$graphic:button_element"
  98.         ohos:text_size="50"
  99.         ohos:text_color="#FFFFFF"
  100.         ohos:top_margin="25vp"
  101.         ohos:right_margin="20vp"
  102.         ohos:left_margin="20vp"
  103.         />
  104.   
  105. </DirectionalLayout>
复制代码
继续在"resources/base/graphic/"目录下增加如下文件:
1.text_element.xml文件用来定义Text和TextField背景属性。
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <shape xmlns:ohos="http://schemas.huawei.com/res/ohos"
  3.        ohos:shape="rectangle">
  4.     <solid
  5.         ohos:color="#FFFFFF"/>
  6. </shape>
复制代码
2.button_element.xml文件用来定义Button背景属性。
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <shape xmlns:ohos="http://schemas.huawei.com/res/ohos"
  3.        ohos:shape="rectangle">
  4.     <corners
  5.         ohos:radius="6vp"/>
  6.     <solid
  7.         ohos:color="#70DBDB"/>
  8. </shape>
复制代码

然后在"slice/MainAblitySlice"中添加如下代码:
  • 在onStart()方法中设置需要创建的数据库文件名,并创建数据库实例。
  • 在btnWrite()方法中,设置write_btn的点击事件回调,点击写入数据,并用ToastDialog提示写入成功。
  • 在btnRead()方法中,设置read_btn的点击事件回调,点击读取数据,并用ToastDialog展示读取的内容。
  • 在btnDelete()方法中,设置delete_btn的点击事件回调,点击进行数据库文件的删除,并用ToastDialog提示删除成功。

  1. import ohos.aafwk.ability.AbilitySlice;
  2. import ohos.aafwk.content.Intent;
  3. import ohos.agp.components.Button;
  4. import ohos.agp.components.Component;
  5. import ohos.agp.components.TextField;
  6. import ohos.agp.window.dialog.ToastDialog;
  7. import ohos.app.Context;
  8. import ohos.data.DatabaseHelper;
  9. import ohos.data.preferences.Preferences;

  10. import java.util.Locale;

  11. public class MainAbilitySlice extends AbilitySlice {
  12.     private Context context;
  13.     private Button btnWrite;
  14.     private Button btnRead;
  15.     private Button btnDelete;
  16.     private TextField textFiledFruit;
  17.     private TextField textFiledNumber;
  18.     private String filename;
  19.     private Preferences preferences;
  20.     private DatabaseHelper databaseHelper;

  21.     [url=home.php?mod=space&uid=2735960]@Override[/url]
  22.     public void onStart(Intent intent) {
  23.         super.onStart(intent);
  24.         super.setUIContent(ResourceTable.Layout_ability_main);
  25.         context = getContext();
  26.         btnWrite = (Button) findComponentById(ResourceTable.Id_write_btn);
  27.         btnRead = (Button) findComponentById(ResourceTable.Id_read_btn);
  28.         btnDelete = (Button) findComponentById(ResourceTable.Id_delete_btn);
  29.         textFiledFruit = (TextField) findComponentById(ResourceTable.Id_text_fruit);
  30.         textFiledNumber = (TextField) findComponentById(ResourceTable.Id_text_number);
  31.         databaseHelper = new DatabaseHelper(context);
  32.         filename = "pdb";
  33.         preferences = databaseHelper.getPreferences(filename);
  34.         btnWrite();
  35.         btnRead();
  36.         btnDelete();
  37.     }

  38.     private void btnWrite() {
  39.         btnWrite.setClickedListener(new Component.ClickedListener() {
  40.             @Override
  41.             public void onClick(Component component) {
  42.                 String fruit = textFiledFruit.getText();
  43.                 try {
  44.                     int number = Integer.parseInt(textFiledNumber.getText());
  45.                     preferences.putInt("number",number);
  46.                     preferences.putString("fruit",fruit);
  47.                     preferences.flush();
  48.                     new ToastDialog(context).setText("Write to DB file success").show();
  49.                 } catch (NumberFormatException e) {
  50.                     new ToastDialog(context).setText("Please input number in Number row").show();
  51.                 }
  52.             }
  53.         });
  54.     }

  55.     private void btnRead() {
  56.         btnRead.setClickedListener(new Component.ClickedListener() {
  57.             @Override
  58.             public void onClick(Component component) {
  59.                 String string = String.format(Locale.ENGLISH,"Fruit: %s,Number: %d",
  60.                         preferences.getString("fruit", ""),preferences.getInt("number", 0));
  61.                 new ToastDialog(context).setText(string).show();
  62.             }
  63.         });
  64.     }

  65.     private void btnDelete() {
  66.         btnDelete.setClickedListener(new Component.ClickedListener() {
  67.             @Override
  68.             public void onClick(Component component) {
  69.                 if (databaseHelper.deletePreferences(filename)) {
  70.                     preferences.clear();
  71.                     new ToastDialog(context).setText("Delete DB file success").show();
  72.                 } else {
  73.                     new ToastDialog(context).setText("Delete DB file failed").show();
  74.                 }
  75.             }
  76.         });
  77.     }
  78. }
复制代码

说明
以上代码仅demo演示参考使用,产品化的代码需要考虑数据校验和国际化。


回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友