鸿蒙系统学习四-数据和权限管理

9 篇文章 0 订阅
9 篇文章 0 订阅

本地应用数据管理

鸿蒙使用SQLite 作为持久化存储引擎,分为关系型数据库(Relational Database)和对象映射关系型 数据库(Object Relational Mapping Database),此外还提供一种轻量级偏好数据库 (Light Weight Preference Database)

关系型数据库(Relational Database)

默认配置
  • 如果不指定数据库的日志模式,那么系统默认日志方式是WAL(Write Ahead Log)模式。
  • 如果不指定数据库的落盘模式,那么系统默认落盘方式是FULL模式。 HarmonyOS数据库使用的共享内存默认大小是2MB。
约束与限制
  • 数据库中连接池的最大数量是4个,用以管理用户的读写操作。
  • 为保证数据的准确性,数据库同一时间只能支持一个写操作。

具体API参考官网,这里不具体展开关系型数据库

对象映射关系型 数据库(Object Relational Mapping Database)

具体API参考官网,这里不具体展开对象映射关系型

轻量级偏好数据库 (Light Weight Preference Database)

具体API参考官网,轻量级偏好数据库

分布式数据服务

支持用户数据跨设备同步,通过帐 号、应用唯一标识和数据库三元组来对属于不同应用的数据进行隔离。
使用方式
1.在config.json中添加ohos.permission.DISTRIBUTED_DATASYNC权限。

// 添加在abilities同一目录层级
"reqPermissions": [
    {
        "name": "ohos.permission.DISTRIBUTED_DATASYNC"
    }
]

2.创建KvManagerConfig对象和分布式数据库管理器

KvManagerConfig config = new KvManagerConfig(context);
KvManager kvManager = KvManagerFactory.getInstance().createKvManager(config);

3.获取/创建单版本分布式数据库。
创建单版本分布式数据库,默认开启组网设备间自动同步功能,如果应用对性能比较敏感建议设置关闭自动同步功能setAutoSync(false),主动调用sync接口同步。

try {
    Options options = new Options();
    options.setCreateIfMissing(true).setEncrypt(false).setKvStoreType(KvStoreType.SINGLE_VERSION);
    String storeId = "testApp";
    SingleKvStore singleKvStore = kvManager.getKvStore(options, storeId);
} catch (KvStoreException e) {
    HiLog.warn(LABEL_LOG,  "getKvStore:" + e.getKvStoreErrorCode());
}

4.订阅分布式数据变化。

class KvStoreObserverClient implements KvStoreObserver {
    @Override
    public void onChange(ChangeNotification notification) {
        List<Entry> insertEntries = notification.getInsertEntries();
        List<Entry> updateEntries = notification.getUpdateEntries();
        List<Entry> deleteEntries = notification.getDeleteEntries();
    }
}

KvStoreObserver kvStoreObserverClient = new KvStoreObserverClient();
singleKvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_ALL, kvStoreObserverClient);

5.数据写入
单条写入使用putString,对性能比较敏感,建议使用批量写入putBatch

try {
    String key = "todayWeather";
    String value = "Sunny";
    singleKvStore.putString(key, value);
} catch (KvStoreException e) {
    HiLog.warn(LABEL_LOG, "putString:" + e.getKvStoreErrorCode());
}

6.查询数据。

try {
    String key = "todayWeather";
    String value = singleKvStore.getString(key);
} catch (KvStoreException e) {
    HiLog.warn(LABEL_LOG, "getString:" + e.getKvStoreErrorCode());
}

7.同步数据
同步方式为PUSH_ONLY

List<DeviceInfo> deviceInfoList = kvManager.getConnectedDevicesInfo(DeviceFilterStrategy.NO_FILTER);
List<String> deviceIdList = new ArrayList<>();
for (DeviceInfo deviceInfo : deviceInfoList) {
    deviceIdList.add(deviceInfo.getId());
}
singleKvStore.sync(deviceIdList, SyncMode.PUSH_ONLY);

8.操作完成关闭数据库

try {
    kvManager.closeKvStore(singleKvStore);
} catch (KvStoreException e) {
    HiLog.warn(LABEL_LOG, "closeKvStore:" + e.getKvStoreErrorCode());
}

9.删除分布式数据库

try {
    kvManager.deleteKvStore(storeId);
} catch (KvStoreException e) {
    HiLog.warn(LABEL_LOG, "deleteKvStore:" + e.getKvStoreErrorCode());
}

分布式文件服务

在多个终端设备间为单个设备上应用程序创建的文件提供多终端的分布式共享能力。
应用通过Context.getDistributedDir()接口获取分布式目录,在该目录下创建、删除、读写文件或目录。
使用方式
1.a设备获取目录,创建文件hello.txt,并写入内容"Hello World"。

File distDir = context.getDistributedDir();
String filePath = distDir + File.separator + "hello.txt";
FileWriter fileWriter = new FileWriter(filePath, true);
fileWriter.write("Hello World");
fileWriter.close();

2.通过Context.getDistributedDir()接口获取分布式目录,进行相关操作

File distDir = context.getDistributedDir();
String filePath = distDir + File.separator + "hello.txt";
FileReader fileReader = new FileReader(filePath);
char[] buffer = new char[1024];        
fileReader.read(buffer);        
fileReader.close();        
System.out.println(buffer);

数据搜索服务

在单个设备上,为应用程序提供搜索引擎级的全文索引管理、建立索引和搜索功能。
详情见官方文档融合搜索
这边不具体展开,暂时不需要这种场景。

数据存储管理

为应用开发者提供系统存储路径、存储设备列表,存储设备属性的查询和管理功能。主要是对本地存储、SD卡、U盘设备进行操作,结构如图所示:
在这里插入图片描述
开发API如下:
在这里插入图片描述
在这里插入图片描述
代码示例:

// 获取默认存储设备挂载状态
MountState status = DataUsage.getDiskMountedStatus();
// 获取存储设备列表
Optional<List<Volume>> list = DataUsage.getVolumes();
// 默认存储设备是否为可插拔设备
boolean pluggable = DataUsage.isDiskPluggable();
static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00201, "MY_TAG"); 

// 获取example.txt 文件所在的存储设备的视图属性
Optional<Volume> volume = DataUsage.getVolume(new File("/sdcard/example.txt"));
volume.ifPresent(theVolume -> { 
        HiLog.info(LABEL, "isEmulated: %{public}t", theVolume.isEmulated());
        HiLog.info(LABEL, "isPluggable: %{public}t", theVolume.isPluggable());
        HiLog.info(LABEL, "Description: %{public}s", theVolume.getDescription());
        HiLog.info(LABEL, "Volume UUID: %{public}d", theVolume.getVolUuid());
    }
);
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值