鸿蒙轻量级数据库DatabaseHelper基本用法和技巧 | 您所在的位置:网站首页 › 鸿蒙系统运用技巧和方法 › 鸿蒙轻量级数据库DatabaseHelper基本用法和技巧 |
[[438853]] 想了解更多内容,请访问: 51CTO和华为官方合作共建的鸿蒙技术社区 https://harmonyos.51cto.com 前言:今天要讲的是鸿蒙里面轻量级数据 DatabaseHelper基本用法一些技巧,那么废话不多说我们正式开始。 效果图![]() ![]() ![]() ![]() ![]() 轻量级偏好数据库是轻量级存储,主要用于保存应用的一些常用配置。它是使用键值对的形式来存储数据的,保存数据时,需要给这条数据提供一个键,读取数据时再通过这个键把对应的值取出来。 说明![]() 通过观察源码 轻量级偏好数据库值的存储数据类型包括整型、长整型、浮点型、布尔型、字符串型、字符串型Set集合。数据存储在本地文件中,同时也加载在内存中,不适合需要存储大量数据和频繁改变数据的场景,建议存储的数据不超过一万条。 2.创建数据库创建数据库使用数据库操作的辅助类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); 3.写入数据我们这边在拿到输入框输入的数字和文字 然后在按钮点击的是调用preferences 里面put 方法将数据存储起来 通过Preferences的putString(String var1, String var2)和putInt(String var1, int var2)方法可以将数据写入Preferences实例,通过flush()或者flushSync()将Preferences实例持久化。 flush()会立即更改内存中的Preferences对象,但会将更新异步写入磁盘。flushSync()更改内存中的数据的同时会将数据同步写入磁盘。由于flushSync()是同步的,建议不要从主线程调用它,以避免界面卡顿。 /*** * 写入数据 * * */ 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(); } } }); } 4.读取数据我们通过调用 preferences 中的get方法来获取存储在DataBase库中的数据 通过Preferences的getString(String var1, String var2)和getInt(String var1, int var2)方法传入键来获取对应的值;如果键不存在,则返回默认值。 例如获取上述fruit和number键的值,如果fruit和number键不存在,则会分别返回""和0值。通过默认值的设置,来避免程序出现异常。 /*** * * 读取数据 * */ 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(); } }); } 5.删除数据库通过DatabaseHelper的deletePreferences(String name)方法删除指定文件。 删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。以删除上述名称为"pdb"的文件为例。 /** * 删除数据 * */ 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(); } } }); } 说明轻量级偏好数据库支持数据库文件的创建、移动,数据的查询、插入、删除,以及支持注册观察者来观察数据是否发生变化。详细信息可参考轻量级偏好数据库。 6.缓存list 数据通过观察源码我们发现 DatabaseHelper轻量级数据库是没有办法直接存储我们的list集合 这个是我们该怎么办 我们通过将List转成json字符串 然后将json存起来 我们在取值的拿到json字符串在还原成list就可以实现了 为了方便演示我们这边写了一个工具类 存储list的方法 /** * 4.存储list */ public static void putSelectBean(Context context, List phoneList, String key) { databaseHelper = new DatabaseHelper(context); preferences = databaseHelper.getPreferences(filename); Gson gson = new Gson(); String json = gson.toJson(phoneList); preferences.putString(key, json); preferences.flush(); }我们写了一个 putSelectBean 来存储我们的list 读取 list的方法 /** * 读取list */ public static List getSelectBean(Context context, String key) { databaseHelper = new DatabaseHelper(context); preferences = databaseHelper.getPreferences(filename); Gson gson = new Gson(); String json = preferences.getString(key, null); Type type = new TypeToken() { }.getType(); List arrayList = gson.fromJson(json, type); return arrayList; }具体存储list调用 /*** * * 缓存list 集合类型数据 * */ private void btnSavelist() { btnsavelist.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { UserBean userBean=new UserBean(); userBean.setUsername("test"); userBean.setPassword("123456"); List datalist=new ArrayList(); datalist.add(userBean); DataBaseUtil.putSelectBean(context,datalist,"datalist"); new ToastDialog(context).setText("写入成功").show(); } }); }读取list类型数据调用 /*** * * 读取list 集合类型数据 * */ private void btnReadList(){ btn_read_list.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { ListgetData= (List) DataBaseUtil.getSelectBean(context,"datalist"); UserBean userBean= getData.get(0); new ToastDialog(context).setText(userBean.getUsername()+userBean.getPassword()).show(); } }); } 7.DatabaseHelper存储的简单封装我们在使用 DatabaseHelper的时候每次都要 DatabaseHelper databaseHelper = new DatabaseHelper(context); String filename = "pdb"; Preferences preferences = databaseHelper.getPreferences(filename);然后调用 preferences 的put方法存储 和get方法读取 代码显得不是很简洁 我们做一个简单的工具类封装即可 存储方法的封装 private static String filename = "pdb"; private static Preferences preferences; private static DatabaseHelper databaseHelper; /** * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法 * * @param context * @param key * @param object * @param :DataBaseUtil.setParam(this, "key", "value"); * key -- userid / accountId obj== */ public static void setParam(Context context, String key, Object object) { String type = "String"; if (object != null) { type = object.getClass().getSimpleName(); } databaseHelper = new DatabaseHelper(context); preferences = databaseHelper.getPreferences(filename); if ("String".equals(type)) { preferences.putString(key, (String) object); } else if ("Integer".equals(type) || "int".equals(type)) { preferences.putInt(key, (Integer) object); } else if ("Boolean".equals(type) || "boolean".equals(type)) { preferences.putBoolean(key, (Boolean) object); } else if ("Float".equals(type) || "float".equals(type)) { preferences.putFloat(key, (Float) object); } else if ("Long".equals(type) || "long".equals(type)) { preferences.putLong(key, (Long) object); } preferences.flush(); }读取方法的简单封装 /** * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值 * * @param context * @param key 关键字 * @param defaultObject 若取回空值则返回此默认值 * @param :DataBaseUtil.getParam(Activity.this, "key", "defaultValue"); * @return */ public static Object getParam(Context context, String key, Object defaultObject) { String type = "String"; if (defaultObject != null) { type = defaultObject.getClass().getSimpleName(); } databaseHelper = new DatabaseHelper(context); preferences = databaseHelper.getPreferences(filename); if ("String".equals(type)) { return preferences.getString(key, (String) defaultObject); } else if ("Integer".equals(type) || "int".equals(type)) { return preferences.getInt(key, (Integer) defaultObject); } else if ("Boolean".equals(type) || "boolean".equals(type)) { return preferences.getBoolean(key, (Boolean) defaultObject); } else if ("Float".equals(type) || "float".equals(type)) { return preferences.getFloat(key, (Float) defaultObject); } else if ("Long".equals(type) || "long".equals(type)) { return preferences.getLong(key, (Long) defaultObject); } return null; }具体调用 /*** * * 调用工具类方法存储 */ private void btnSavetoutils() { btnsave_toutils.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { String fruit = textFiledFruit.getText(); try { int number = Integer.parseInt(textFiledNumber.getText()); DataBaseUtil.setParam(context,"number",number); DataBaseUtil.setParam(context,"fruit",fruit); new ToastDialog(context).setText("写入成功").show(); } catch (NumberFormatException e) { new ToastDialog(context).setText("Please input number in Number row").show(); } } }); } 完整示例xml布局代码 布局效果图![]() java逻辑代码 package com.example.datademo.slice; import com.example.datademo.ResourceTable; import com.example.datademo.bean.UserBean; import com.example.datademo.utils.DataBaseUtil; 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.ArrayList; import java.util.List; 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; private Button btnsavelist; private Button btnsave_toutils; private Button btn_read_list; @Override 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); btnsavelist= (Button) findComponentById(ResourceTable.Id_save_list); btnsave_toutils= (Button) findComponentById(ResourceTable.Id_save_toutils); btn_read_list= (Button) findComponentById(ResourceTable.Id_read_list); databaseHelper = new DatabaseHelper(context); filename = "pdb"; preferences = databaseHelper.getPreferences(filename); btnWrite(); btnRead(); btnDelete(); btnSavelist(); btnSavetoutils(); btnReadList(); } /*** * 写入数据 * * */ 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(); } } }); } /*** * * 缓存list 集合类型数据 * */ private void btnSavelist() { btnsavelist.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { UserBean userBean=new UserBean(); userBean.setUsername("test"); userBean.setPassword("123456"); List datalist=new ArrayList(); datalist.add(userBean); DataBaseUtil.putSelectBean(context,datalist,"datalist"); new ToastDialog(context).setText("写入成功").show(); } }); } /*** * * 调用工具类方法存储 */ private void btnSavetoutils() { btnsave_toutils.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { String fruit = textFiledFruit.getText(); try { int number = Integer.parseInt(textFiledNumber.getText()); DataBaseUtil.setParam(context,"number",number); DataBaseUtil.setParam(context,"fruit",fruit); new ToastDialog(context).setText("写入成功").show(); } catch (NumberFormatException e) { new ToastDialog(context).setText("Please input number in Number row").show(); } } }); } /*** * * 读取list 集合类型数据 * */ private void btnReadList(){ btn_read_list.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { ListgetData= (List) DataBaseUtil.getSelectBean(context,"datalist"); UserBean userBean= getData.get(0); new ToastDialog(context).setText(userBean.getUsername()+userBean.getPassword()).show(); } }); } }bean 类 package com.example.datademo.bean; /*** * * 创建人:xuqing * 创建时间:2021年6月20日20:54:28 * 类说明:用户账号密码 bean类 * * */ public class UserBean { private String username; private String password; public UserBean() { } public UserBean(String username, String password) { this.username = username; this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "UserBean{" + "username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }工具类核心代码 package com.example.datademo.utils; import com.example.datademo.bean.UserBean; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import ohos.app.Context; import ohos.data.DatabaseHelper; import ohos.data.preferences.Preferences; import java.io.*; import java.lang.reflect.Type; import java.util.List; public class DataBaseUtil { private static String filename = "pdb"; private static Preferences preferences; private static DatabaseHelper databaseHelper; /** * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法 * * @param context * @param key * @param object * @param :DataBaseUtil.setParam(this, "key", "value"); * key -- userid / accountId obj== */ public static void setParam(Context context, String key, Object object) { String type = "String"; if (object != null) { type = object.getClass().getSimpleName(); } databaseHelper = new DatabaseHelper(context); preferences = databaseHelper.getPreferences(filename); if ("String".equals(type)) { preferences.putString(key, (String) object); } else if ("Integer".equals(type) || "int".equals(type)) { preferences.putInt(key, (Integer) object); } else if ("Boolean".equals(type) || "boolean".equals(type)) { preferences.putBoolean(key, (Boolean) object); } else if ("Float".equals(type) || "float".equals(type)) { preferences.putFloat(key, (Float) object); } else if ("Long".equals(type) || "long".equals(type)) { preferences.putLong(key, (Long) object); } preferences.flush(); } /** * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值 * * @param context * @param key 关键字 * @param defaultObject 若取回空值则返回此默认值 * @param :DataBaseUtil.getParam(Activity.this, "key", "defaultValue"); * @return */ public static Object getParam(Context context, String key, Object defaultObject) { String type = "String"; if (defaultObject != null) { type = defaultObject.getClass().getSimpleName(); } databaseHelper = new DatabaseHelper(context); preferences = databaseHelper.getPreferences(filename); if ("String".equals(type)) { return preferences.getString(key, (String) defaultObject); } else if ("Integer".equals(type) || "int".equals(type)) { return preferences.getInt(key, (Integer) defaultObject); } else if ("Boolean".equals(type) || "boolean".equals(type)) { return preferences.getBoolean(key, (Boolean) defaultObject); } else if ("Float".equals(type) || "float".equals(type)) { return preferences.getFloat(key, (Float) defaultObject); } else if ("Long".equals(type) || "long".equals(type)) { return preferences.getLong(key, (Long) defaultObject); } return null; } //删除数据 public static void removeParam(Context context, Object defaultObject) { databaseHelper = new DatabaseHelper(context); preferences = databaseHelper.getPreferences(filename); preferences.clear(); } /** * 4.存储list */ public static void putSelectBean(Context context, List phoneList, String key) { databaseHelper = new DatabaseHelper(context); preferences = databaseHelper.getPreferences(filename); Gson gson = new Gson(); String json = gson.toJson(phoneList); preferences.putString(key, json); preferences.flush(); } /** * 读取list */ public static List getSelectBean(Context context, String key) { databaseHelper = new DatabaseHelper(context); preferences = databaseHelper.getPreferences(filename); Gson gson = new Gson(); String json = preferences.getString(key, null); Type type = new TypeToken() { }.getType(); List arrayList = gson.fromJson(json, type); return arrayList; } //存数据到SD卡里面 public static void storetosd(File file, List data) { try { Gson gson = new Gson(); String json = gson.toJson(data); OutputStream os = new FileOutputStream(file); os.write(json.getBytes("utf-8")); os.close(); } catch (Exception e) { e.printStackTrace(); } } //读取SD卡里面的数据 public static List readbysd(File file) { List arrayList = null; Gson gson = new Gson(); try { InputStream is = new FileInputStream(file); byte[] data = new byte[is.available()]; is.read(data); String content = new String(data, "utf-8"); Type type = new TypeToken() { }.getType(); arrayList = gson.fromJson(content, type); is.close(); } catch (Exception e) { e.printStackTrace(); } return arrayList; } }到此DatabaseHelper基本就讲完了,恭喜你看完此文你就会掌握了鸿蒙轻量级数据库DatabaseHelper的用法和使用技巧。 最后总结鸿蒙的 DatabaseHelper轻量级数据库和安卓的 sharepreferences 用法和类似都是默认只能存储基本数据类型。但是鸿蒙提供了 flush 和 flushSync 两个方法 将Preferences实例持久化。 flush()会立即更改内存中的Preferences对象,但会将更新异步写入磁盘。flushSync()更改内存中的数据的同时会将数据同步写入磁盘。由于flushSync()是同步的,建议不要从主线程调用它,以避免界面卡顿。 这里和安卓还是有些许区别,同学们要注意。使用起来 DatabaseHelper也比较方便和简单。以及一些非基本数据类型怎么转化来存储我也讲到,同学有兴趣可以下载代码来看看。最后希望我的文章能帮助到各位解决问题 ,以后我还会贡献更多有用的代码分享给大家。 想了解更多内容,请访问: 51CTO和华为官方合作共建的鸿蒙技术社区 https://harmonyos.51cto.com
|
CopyRight 2018-2019 实验室设备网 版权所有 |