文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

HarmonyOS基础技术赋能之轻量级数据库Preferencens

2024-12-14 01:05

关注

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

引言

轻量级数据存储适用于对Key-Value结构的数据进行存取和持久化操作。主要用于保存应用的一些常用配置,并不适合存储大量数据和频繁改变数据的场景。用户的数据保存在文件中,可以持久化的存储在设备上。需要注意的是用户访问的实例包含文件所有数据,并一直加载在设备的内存中,并通过轻量级数据存储的API完成数据操作。

功能介绍

轻量级数据存储向本地应用提供的API支持本地应用读写数据及观察数据变化。数据存储形式为键值对,键的类型为字符串型(String),值的存储数据类型包括整型(int)、字符串型(String)、布尔型(boolean)、浮点型(float)、长整型(long)、字符串型Set集合(Set)。

开发指南

1. 创建Preferences实例。

  1. // context为上下文对象,PREFERENCE_FILE_NAME为轻量级数据库文件名,String类型,可以自定义 
  2. databaseHelper = new DatabaseHelper(context); 
  3. preferences = databaseHelper.getPreferences(PREFERENCE_FILE_NAME); 

2. 将数据写入指定文件。

  1. // preferences.putString()为存入String类型的数据 
  2. preferences.putString(String key, String value); 
  3. // flush()为异步持久化数据;flushSync()为同步持久化数据 
  4. preferences.flush()/preferences.flushSync(); 

3.从指定文件读取数据。

  1. //读取时传入的key, 要与写入时传入的key一致,才能获取对应数据,第二个参数为默认值。 
  2.   preferences.getString(String key, String default

4. 开发者可以向Preferences实例注册观察者,观察数据更新变化。

  1. private class PreferencesObserverImpl implements Preferences.PreferencesObserver { 
  2.     
  3.     @Override     
  4.     public void onChange(Preferences preferences, String key) { 
  5.         if ("key".equals(key)) { 
  6.            HiLog.info(LABLE, "Change Received:[key=value]");         
  7.         }     
  8.     } 
  9.  
  10.  
  11. // 向preferences实例注册观察者 
  12. PreferencesObserverImpl observer = new PreferencesObserverImpl(); 
  13. preferences.registerObserver(observer); 
  14. // 修改数据后,observer的onChange方法会被回调 
  15. // 向preferences实例注销观察者 
  16. preferences.unRegisterObserver(observer); 

源码如下:

1.PreferenceUtils

  1. public class PreferenceUtils { 
  2.  
  3.   private static String PREFERENCE_FILE_NAME = "prefrence_file"
  4.   private static Preferences preferences; 
  5.   private static DatabaseHelper databaseHelper; 
  6.   private static PreferencesObserver mPreferencesObserver; 
  7.  
  8.   private static void initPreference(Context context){ 
  9.     if(databaseHelper==null){ 
  10.       databaseHelper = new DatabaseHelper(context); 
  11.     } 
  12.     if(preferences==null){ 
  13.       preferences = databaseHelper.getPreferences(PREFERENCE_FILE_NAME); 
  14.     } 
  15.  
  16.   } 
  17.  
  18.   //存放、获取时传入的context必须是同一个context,否则存入的数据无法获取 
  19.   public static void putString(Context context, String key, String value) { 
  20.     initPreference(context); 
  21.     preferences.putString(key, value); 
  22.     preferences.flush(); 
  23.   } 
  24.  
  25.    
  26.   public static String getString(Context context, String key) { 
  27.     initPreference(context); 
  28.     return preferences.getString(keynull); 
  29.   } 
  30.  
  31.  
  32.   public static void putInt(Context context, String keyint value) { 
  33.     initPreference(context); 
  34.     preferences.putInt(key, value); 
  35.     preferences.flush(); 
  36.   } 
  37.  
  38.    
  39.   public static int getInt(Context context, String key) { 
  40.     initPreference(context); 
  41.     return preferences.getInt(key, -1); 
  42.   } 
  43.  
  44.  
  45.   public static void putLong(Context context, String key, long value) { 
  46.     initPreference(context); 
  47.     preferences.putLong(key, value); 
  48.     preferences.flush(); 
  49.   } 
  50.  
  51.    
  52.   public static long getLong(Context context, String key) { 
  53.     initPreference(context); 
  54.     return preferences.getLong(key, -1L); 
  55.   } 
  56.  
  57.  
  58.   public static void putBoolean(Context context, String key, boolean value) { 
  59.     initPreference(context); 
  60.     preferences.putBoolean(key, value); 
  61.     preferences.flush(); 
  62.   } 
  63.  
  64.    
  65.   public static boolean getBoolean(Context context, String key) { 
  66.     initPreference(context); 
  67.     return preferences.getBoolean(keyfalse); 
  68.   } 
  69.  
  70.  
  71.   public static void putFloat(Context context, String keyfloat value) { 
  72.     initPreference(context); 
  73.     preferences.putFloat(key, value); 
  74.     preferences.flush(); 
  75.   } 
  76.  
  77.    
  78.   public static float getFloat(Context context, String key) { 
  79.     initPreference(context); 
  80.     return preferences.getFloat(key, 0.0F); 
  81.   } 
  82.  
  83.  
  84.   public static void putStringSet(Context context, String keySet set) { 
  85.     initPreference(context); 
  86.     preferences.putStringSet(keyset); 
  87.     preferences.flush(); 
  88.   } 
  89.  
  90.    
  91.   public static Set getStringSet(Context context, String key) { 
  92.     initPreference(context); 
  93.     return preferences.getStringSet(keynull); 
  94.   } 
  95.  
  96.  
  97.   public static boolean deletePreferences(Context context) { 
  98.     initPreference(context); 
  99.     boolean isDelete= databaseHelper.deletePreferences(PREFERENCE_FILE_NAME); 
  100.     return isDelete; 
  101.   } 
  102.  
  103.  
  104.   public static void registerObserver(Context context,PreferencesObserver preferencesObserver){ 
  105.     initPreference(context); 
  106.     mPreferencesObserver=preferencesObserver; 
  107.     preferences.registerObserver(mPreferencesObserver); 
  108.   } 
  109.  
  110.   public static void unregisterObserver(){ 
  111.     if(mPreferencesObserver!=null){ 
  112.       // 向preferences实例注销观察者 
  113.       preferences.unregisterObserver(mPreferencesObserver); 
  114.     } 
  115.   } 
  116.  

2. MainAbilitySlice

  1. public class MainAbilitySlice extends AbilitySlice implements ClickedListener { 
  2.   private TextField tfName; 
  3.   private TextField tfGener; 
  4.   private TextField tfAge; 
  5.   private TextField tfWeight; 
  6.   private Text tvResultQuery; 
  7.   private Text tvResultListener; 
  8.   private String name
  9.   private boolean isMan; 
  10.   private int age; 
  11.   private float weight; 
  12.  
  13.  
  14.   @Override 
  15.   public void onStart(Intent intent) { 
  16.     super.onStart(intent); 
  17.     super.setUIContent(ResourceTable.Layout_ability_main); 
  18.     tfName=(TextField)findComponentById(ResourceTable.Id_tf_name); 
  19.     tfGener=(TextField)findComponentById(ResourceTable.Id_tf_isMan); 
  20.     tfAge=(TextField)findComponentById(ResourceTable.Id_tf_age); 
  21.     tfWeight=(TextField)findComponentById(ResourceTable.Id_tf_weight); 
  22.     tvResultQuery=(Text) findComponentById(ResourceTable.Id_tvResultQuery); 
  23.     tvResultListener=(Text) findComponentById(ResourceTable.Id_tvResultListener); 
  24.     Button btSave=(Button)findComponentById(ResourceTable.Id_bt_save); 
  25.     Button btQuery=(Button)findComponentById(ResourceTable.Id_bt_query); 
  26.     Button btRegister=(Button)findComponentById(ResourceTable.Id_bt_regist); 
  27.     Button btUnRegister=(Button)findComponentById(ResourceTable.Id_bt_unregist); 
  28.     btSave.setClickedListener(this); 
  29.     btQuery.setClickedListener(this); 
  30.     btRegister.setClickedListener(this); 
  31.     btUnRegister.setClickedListener(this); 
  32.   } 
  33.  
  34.   @Override 
  35.   public void onActive() { 
  36.     super.onActive(); 
  37.   } 
  38.  
  39.   @Override 
  40.   public void onForeground(Intent intent) { 
  41.     super.onForeground(intent); 
  42.   } 
  43.  
  44.   @Override 
  45.   public void onClick(Component component) { 
  46.     switch (component.getId()){ 
  47.       case ResourceTable.Id_bt_save: 
  48.         PreferenceUtils.putString(MyApplication.mContext,"name",tfName.getText()); 
  49.         if(tfGener.getText().equals("男")){ 
  50.           PreferenceUtils.putBoolean(MyApplication.mContext,"gender",true); 
  51.         } 
  52.         try { 
  53.           String age=tfAge.getText(); 
  54.           String weight=tfWeight.getText(); 
  55.           int ageInt=Integer.parseInt(age); 
  56.           float weightFloat=Float.parseFloat(weight); 
  57.           PreferenceUtils.putInt(MyApplication.mContext,"age",ageInt); 
  58.           PreferenceUtils.putFloat(MyApplication.mContext,"weight",weightFloat); 
  59.         }catch (Exception e){ 
  60.           e.printStackTrace(); 
  61.         } 
  62.         new ToastDialog(this).setDuration(2000).setText("保存成功").setAlignment(LayoutAlignment.CENTER).show(); 
  63.         break; 
  64.       case ResourceTable.Id_bt_query: 
  65.          name=PreferenceUtils.getString(MyApplication.mContext,"name"); 
  66.          isMan=PreferenceUtils.getBoolean(MyApplication.mContext,"gender"); 
  67.          age=PreferenceUtils.getInt(MyApplication.mContext,"age"); 
  68.          weight=PreferenceUtils.getFloat(MyApplication.mContext,"weight"); 
  69.         if(isMan){ 
  70.           tvResultQuery.setText("查询结果:"+name+"/男/"+age+"/"+weight); 
  71.         }else { 
  72.           tvResultQuery.setText("查询结果:"+name+"/女/"+age+"/"+weight); 
  73.         } 
  74.         new ToastDialog(this).setDuration(2000).setText("查询成功").setAlignment(LayoutAlignment.CENTER).show(); 
  75.         break; 
  76.       case ResourceTable.Id_bt_regist: 
  77.         PreferenceUtils.registerObserver(this,new PreferencesObserver() { 
  78.           @Override 
  79.           public void onChange(Preferences preferences, String key) { 
  80.             switch (key){ 
  81.               case "name"
  82.                  name=PreferenceUtils.getString(MyApplication.mContext,"name"); 
  83.                 break; 
  84.               case "gender"
  85.                  isMan=PreferenceUtils.getBoolean(MyApplication.mContext,"gender"); 
  86.                 break; 
  87.               case "age"
  88.                  age=PreferenceUtils.getInt(MyApplication.mContext,"age"); 
  89.                 break; 
  90.               case "weight"
  91.                  weight=PreferenceUtils.getFloat(MyApplication.mContext,"weight"); 
  92.                 break; 
  93.             } 
  94.             if(isMan){ 
  95.               tvResultListener.setText("兼停结果:"+name+"/男/"+age+"/"+weight); 
  96.             }else { 
  97.               tvResultListener.setText("兼停结果:"+name+"/女/"+age+"/"+weight); 
  98.             } 
  99.           } 
  100.  
  101.         }); 
  102.         new ToastDialog(this).setDuration(2000).setText("注册成功").setAlignment(LayoutAlignment.CENTER).show(); 
  103.         break; 
  104.       case ResourceTable.Id_bt_unregist: 
  105.         PreferenceUtils.unregisterObserver(); 
  106.         new ToastDialog(this).setDuration(2000).setText("解除注册成功").setAlignment(LayoutAlignment.CENTER).show(); 
  107.         break; 
  108.     } 
  109.  
  110.   } 
  111.  
  112.  
  113.  

3. MyApplication

  1. public class MyApplication extends AbilityPackage { 
  2.   public static Context mContext ; 
  3.  
  4.   @Override 
  5.   public void onInitialize() { 
  6.     super.onInitialize(); 
  7.     mContext=this; 
  8.   } 

4.页面布局ability_main.xml文件

  1. "1.0" encoding="utf-8"?> 
  2.   xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  3.   ohos:height="match_parent" 
  4.   ohos:orientation="vertical" 
  5.   ohos:width="match_parent"
  6.  
  7.   
  8.     ohos:height="match_content" 
  9.     ohos:width="match_parent" 
  10.     ohos:orientation="vertical" 
  11.     ohos:left_padding="15vp" 
  12.     ohos:right_padding="15vp" 
  13.     ohos:top_padding="16vp"
  14.     
  15.       ohos:height="match_content" 
  16.       ohos:width="match_content" 
  17.       ohos:text="姓名" 
  18.       ohos:text_size="18vp"/> 
  19.     
  20.       ohos:id="$+id:tf_name" 
  21.       ohos:height="match_content" 
  22.       ohos:width="match_parent" 
  23.       ohos:text_input_type="pattern_text" 
  24.       ohos:hint="请输入姓名" 
  25.       ohos:text_size="18vp" 
  26.       ohos:hint_color="#cccccc" 
  27.       ohos:top_margin="8vp"/> 
  28.     
  29.       ohos:height="1vp" 
  30.       ohos:width="match_parent" 
  31.       ohos:top_margin="3vp" 
  32.       ohos:background_element="#cccccc"/> 
  33.    
  34.  
  35.  
  36.   
  37.     ohos:height="match_content" 
  38.     ohos:width="match_parent" 
  39.     ohos:orientation="vertical" 
  40.     ohos:left_padding="15vp" 
  41.     ohos:right_padding="15vp" 
  42.     ohos:top_padding="16vp"
  43.     
  44.       ohos:height="match_content" 
  45.       ohos:width="match_content" 
  46.       ohos:text="性别" 
  47.       ohos:text_size="18vp"/> 
  48.     
  49.       ohos:id="$+id:tf_isMan" 
  50.       ohos:height="match_content" 
  51.       ohos:width="match_parent" 
  52.       ohos:text_input_type="pattern_text" 
  53.       ohos:hint="男/女" 
  54.       ohos:text_size="18vp" 
  55.       ohos:hint_color="#cccccc" 
  56.       ohos:top_margin="8vp"/> 
  57.     
  58.       ohos:height="1vp" 
  59.       ohos:width="match_parent" 
  60.       ohos:top_margin="3vp" 
  61.       ohos:background_element="#cccccc"/> 
  62.    
  63.  
  64.  
  65.   
  66.     ohos:height="match_content" 
  67.     ohos:width="match_parent" 
  68.     ohos:orientation="vertical" 
  69.     ohos:left_padding="15vp" 
  70.     ohos:right_padding="15vp" 
  71.     ohos:top_padding="16vp"
  72.     
  73.       ohos:height="match_content" 
  74.       ohos:width="match_content" 
  75.       ohos:text="年龄" 
  76.       ohos:text_size="18vp"/> 
  77.     
  78.       ohos:id="$+id:tf_age" 
  79.       ohos:height="match_content" 
  80.       ohos:width="match_parent" 
  81.       ohos:text_input_type="pattern_number" 
  82.       ohos:hint="请输入年龄" 
  83.       ohos:text_size="18vp" 
  84.       ohos:hint_color="#cccccc" 
  85.       ohos:top_margin="8vp"/> 
  86.     
  87.       ohos:height="1vp" 
  88.       ohos:width="match_parent" 
  89.       ohos:top_margin="3vp" 
  90.       ohos:background_element="#cccccc"/> 
  91.    
  92.  
  93.  
  94.   
  95.     ohos:height="match_content" 
  96.     ohos:width="match_parent" 
  97.     ohos:orientation="vertical" 
  98.     ohos:left_padding="15vp" 
  99.     ohos:right_padding="15vp" 
  100.     ohos:top_padding="16vp"
  101.     
  102.       ohos:height="match_content" 
  103.       ohos:width="match_content" 
  104.       ohos:text="体重" 
  105.       ohos:text_size="18vp"/> 
  106.     
  107.       ohos:id="$+id:tf_weight" 
  108.       ohos:height="match_content" 
  109.       ohos:width="match_parent" 
  110.       ohos:text_input_type="pattern_number" 
  111.       ohos:hint="请输入体重" 
  112.       ohos:text_size="18vp" 
  113.       ohos:hint_color="#cccccc" 
  114.       ohos:top_margin="8vp"/> 
  115.     
  116.       ohos:height="1vp" 
  117.       ohos:width="match_parent" 
  118.       ohos:top_margin="3vp" 
  119.       ohos:background_element="#cccccc"/> 
  120.    
  121.  
  122.  
  123.  
  124.   
  125.     ohos:height="match_content" 
  126.     ohos:width="match_parent" 
  127.     ohos:orientation="horizontal" 
  128.     ohos:top_margin="30vp" 
  129.     ohos:left_margin="15vp" 
  130.     ohos:right_margin="15vp"
  131.     
  132.       ohos:id="$+id:bt_save" 
  133.       ohos:height="40vp" 
  134.       ohos:width="0" 
  135.       ohos:weight="1" 
  136.       ohos:text="保存" 
  137.       ohos:text_size="20vp" 
  138.       ohos:text_color="#ffffff" 
  139.       ohos:right_margin="30vp" 
  140.       ohos:background_element="$graphic:background_main_circle" 
  141.       ohos:layout_alignment="center"/> 
  142.     
  143.       ohos:id="$+id:bt_query" 
  144.       ohos:height="40vp" 
  145.       ohos:width="0" 
  146.       ohos:weight="1" 
  147.       ohos:text="查询" 
  148.       ohos:text_size="20vp" 
  149.       ohos:text_color="#ffffff" 
  150.       ohos:right_margin="30vp" 
  151.       ohos:background_element="$graphic:background_main_circle" 
  152.       ohos:layout_alignment="center"/> 
  153.    
  154.  
  155.   
  156.     ohos:height="match_content" 
  157.     ohos:width="match_parent" 
  158.     ohos:orientation="horizontal" 
  159.     ohos:top_margin="30vp" 
  160.     ohos:left_margin="15vp" 
  161.     ohos:right_margin="15vp"
  162.     
  163.       ohos:id="$+id:bt_regist" 
  164.       ohos:height="40vp" 
  165.       ohos:width="0" 
  166.       ohos:weight="1" 
  167.       ohos:text="注册兼停" 
  168.       ohos:text_size="20vp" 
  169.       ohos:text_color="#ffffff" 
  170.       ohos:right_margin="30vp" 
  171.       ohos:background_element="$graphic:background_main_circle" 
  172.       ohos:layout_alignment="center"/> 
  173.     
  174.       ohos:id="$+id:bt_unregist" 
  175.       ohos:height="40vp" 
  176.       ohos:width="0" 
  177.       ohos:weight="1" 
  178.       ohos:text="解除注册" 
  179.       ohos:text_size="20vp" 
  180.       ohos:text_color="#ffffff" 
  181.       ohos:right_margin="30vp" 
  182.       ohos:background_element="$graphic:background_main_circle" 
  183.       ohos:layout_alignment="center"/> 
  184.    
  185.  
  186.  
  187.  
  188.   
  189.     ohos:id="$+id:tvResultQuery" 
  190.     ohos:height="match_content" 
  191.     ohos:width="match_content" 
  192.     ohos:text_size="18vp" 
  193.     ohos:text="查询结果:" 
  194.     ohos:background_element="#cccccc" 
  195.     ohos:layout_alignment="center" 
  196.     ohos:top_margin="30vp" 
  197.     ohos:padding="10vp"/> 
  198.  
  199.   
  200.     ohos:id="$+id:tvResultListener" 
  201.     ohos:height="match_content" 
  202.     ohos:width="match_content" 
  203.     ohos:text_size="18vp" 
  204.     ohos:text="兼停结果:" 
  205.     ohos:background_element="#cccccc" 
  206.     ohos:layout_alignment="center" 
  207.     ohos:top_margin="30vp" 
  208.     ohos:padding="10vp"/> 
  209.  
  210.  

5.圆角背景图形background_main_circle.xml文件

  1. "1.0" encoding="UTF-8" ?> 
  2. "http://schemas.huawei.com/res/ohos" 
  3.        ohos:shape="rectangle"
  4.     
  5.         ohos:radius="10"/> 
  6.     
  7.         ohos:color="#00aaf5"/> 
  8.  
  9.  

实现效果视频:https://harmonyos.51cto.com/show/7929

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

来源:鸿蒙社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯