鸿蒙系统中连接与操作JSON数据库的实践指南
在移动应用开发中,数据的本地存储与管理是不可或缺的一环,JSON(JavaScript Object Notation)以其轻量级、易读易写的特性,成为了一种非常流行的数据交换格式,在鸿蒙开发(HarmonyOS)中,虽然系统提供了更强大的分布式数据管理能力(如分布式数据库),但在某些轻量级场景或特定需求下,直接操作JSON文件作为本地数据库也是一种常见且高效的选择,本文将详细介绍在鸿蒙系统中如何连接(即访问、读取、写入)JSON数据库(实质上是JSON文件)。
理解“鸿蒙连接JSON数据库”
需要明确一个概念:鸿蒙系统本身没有一个名为“JSON数据库”的官方数据库产品,我们通常所说的“鸿蒙连接JSON数据库”,指的是在鸿蒙应用中,对以JSON格式存储的文件进行读写操作,以达到类似数据库的数据持久化和查询效果,这种JSON文件可以存储在应用的内部存储空间或外部存储空间(需授权)。
准备工作:创建JSON文件
在进行读写操作之前,我们通常需要一个JSON文件作为数据载体,在鸿蒙开发中,我们可以:
- 在资源目录中放置初始JSON文件:
- 在
entry/src/main/resources/base/rawfile目录下放置一个JSON文件(例如database.json),这种方式适合作为应用的初始数据模板。
- 在
- 在应用首次运行时创建JSON文件:
如果应用没有初始数据,或者数据是动态生成的,可以在代码中检查文件是否存在,若不存在则创建一个新的JSON文件。
读取JSON文件数据
读取JSON文件是连接“数据库”的第一步,鸿蒙提供了多种文件操作API,我们可以使用ohos.data.preferences(偏好设置,适合简单键值对,但不适合复杂JSON结构)或更通用的File API结合JSON解析库来操作。
这里我们重点介绍使用File API和Gson(Google的JSON库,鸿蒙开发中常用)来读取复杂JSON数据。
-
添加Gson依赖: 在
entry/build.gradle文件中,确保你的项目中已经添加了Gson依赖(如果尚未添加):dependencies { implementation 'com.google.code.gson:gson:2.8.9' // 或其他最新版本 } -
读取JSON文件示例代码: 假设我们的JSON文件
database.json位于rawfile目录下,内容如下:[ { "id": 1, "name": "张三", "age": 25, "email": "zhangsan@example.com" }, { "id": 2, "name": "李四", "age": 30, "email": "lisi@example.com" } ]我们可以通过以下代码读取并解析这个JSON文件:
import ohos.aafwk.ability.Ability; import ohos.aafwk.content.Intent; import ohos.global.resource.RawFileDescriptor; import ohos.global.resource.Resource; import ohos.utils.zlib.Zlib; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; public class MainAbility extends Ability { private static final String JSON_FILE_NAME = "database.json"; @Override public void onStart(Intent intent) { super.onStart(intent); // 读取JSON数据 List<User> userList = readJsonFile(); if (userList != null) { for (User user : userList) { System.out.println("User: " + user.getName() + ", Age: " + user.getAge()); } } } private List<User> readJsonFile() { Gson gson = new Gson(); List<User> userList = null; try { // 1. 获取RawFileDescriptor RawFileDescriptor rawFileDescriptor = getResourceManager().getResourceRawFileEntry(JSON_FILE_NAME).openRawFileDescriptor(); // 2. 创建输入流 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = rawFileDescriptor.getInputStream().read(buffer)) != -1) { outputStream.write(buffer, 0, len); } byte[] data = outputStream.toByteArray(); rawFileDescriptor.close(); outputStream.close(); // 3. 解析JSON String jsonString = new String(data); userList = gson.fromJson(jsonString, new TypeToken<List<User>>(){}.getType()); } catch (IOException e) { System.err.println("Error reading JSON file: " + e.getMessage()); e.printStackTrace(); } return userList; } // User实体类 public static class User { private int id; private String name; private int age; private String email; // Getters and Setters public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } }说明:
getResourceManager().getResourceRawFileEntry()用于获取rawfile目录下的资源。- 使用
ByteArrayOutputStream将输入流转换为字节数组,再转换为字符串。 gson.fromJson()方法将JSON字符串解析为Java对象列表,这里使用了TypeToken来正确处理泛型类型。
写入JSON文件数据
写入JSON数据通常是将Java对象序列化为JSON字符串,然后写入到文件中,如果文件不存在,则创建;如果存在,则覆盖或追加(根据需求)。
-
写入JSON文件示例代码:
import ohos.app.Context; import ohos.hiviewdfx.HiLog; import ohos.hiviewdfx.HiLogLabel; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; import java.util.List; public class JsonFileWriter { private static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00201, "JsonFileWriter"); private static final String JSON_FILE_PATH = "/data/storage/el2/base/haps/entry/files/user_data.json"; // 应用内部存储路径 public static void writeJsonFile(Context context, List<User> userList) { Gson gson = new Gson(); String jsonString = gson.toJson(userList); try { // 获取应用内部存储文件目录 File filesDir = context.getFilesDir(); File jsonFile = new File(filesDir, "user_data.json"); HiLog.info(LABEL, "JSON file path: %{public}s", jsonFile.getAbsolutePath()); try (Writer writer = new OutputStreamWriter(new FileOutputStream(jsonFile), "UTF-8")) { writer.write(jsonString); HiLog.info(LABEL, "JSON data written successfully."); } } catch (IOException e) { HiLog.error(LABEL, "Error writing JSON file: %{public}s", e.getMessage()); e.printStackTrace(); } } // 示例:如何调用 public static void exampleWrite(Context context) { List<User> newUserList = new ArrayList<>(); newUserList.add(new User(3, "王五", 28, "wangwu@example.com")); newUserList.add(new User(4, "赵六", 35, "zhaoliu@example.com")); writeJsonFile(context, newUserList); } }说明:
context.getFilesDir()获取应用内部存储的私有文件目录路径,这个路径是应用专有的,无需特殊权限。FileOutputStream用于写入文件,如果文件不存在,会自动创建(如果目录存在且有权限)。OutputStreamWriter指定字符编码为UTF-8,避免中文乱码。gson.toJson()将Java对象列表序列化为JSON字符串。- 使用try-with-resources语句确保流资源被正确关闭。
更新与删除JSON数据
JSON文件本身不是真正的数据库,更新和删除数据通常需要“读取-修改-写入”的完整流程:
-
更新数据:
- 读取整个JSON文件到Java对象列表。
- 在列表中找到需要更新的对象,修改其属性。
- 将修改后的列表重新序列化为JSON字符串,写回文件(覆盖原文件)。
-
删除数据:
读取整个JSON文件到Java对象列表



还没有评论,来说两句吧...