如果将服务端的数据存储到app本地进行数据的交互,该如何存储?

各位大佬们,咨询了一个问题:

场景:服务端有很多数据,我想要查询一次,其他的操作,比如增删改查调用了接口之后,不用重新调接口拿数据,而且我本地自己去操作一下数据

问题:我使用首选项存储(@ohos.data.preferences),发现如果数据量太大,存储会失败  ,这个api好像对存储的数据大小有要求,JSON.parse 数据量太大会报错 Unexpected Array in JSON,碰到这种情况该怎么办,希望各位大佬有解决方案或者更优的方案可以帮助一下,感谢

如果将服务端的数据存储到app本地进行数据的交互,该如何存储?-鸿蒙开发者社区


UI框架
UI
Ability框架
2024-07-09 14:47:30
浏览
收藏 0
回答 2
待解决
回答 2
按赞同
/
按时间
鱼弦CTO
1

在 HarmonyOS 中,如果你需要将服务端的数据存储到本地进行数据交互,而发现使用首选项存储 (@ohos.data.preferences) 由于数据量过大导致失败,可以考虑使用其他更合适的本地存储方案。以下是几种常见的解决方案:


1. 使用文件存储

对于大量数据,直接将数据保存为文件(例如 JSON 文件)是一个有效的方法。


写入文件


import file from '@system.file';

// 将数据转换为字符串
const data = {
    // your large data object
};
const jsonString = JSON.stringify(data);

// 写入文件
file.writeText({
    uri: 'internal://app/data.json',
    text: jsonString,
    success: function () {
        console.log('Write successful');
    },
    fail: function (data, code) {
        console.error('Write failed:', data, code);
    }
});


读取文件


import file from '@system.file';

// 读取文件
file.readText({
    uri: 'internal://app/data.json',
    success: function (data) {
        const jsonData = JSON.parse(data.text);
        console.log('Read successful', jsonData);
    },
    fail: function (data, code) {
        console.error('Read failed:', data, code);
    }
});
  1. 使用数据库存储

如果数据结构复杂且需要频繁查询和操作,使用 SQLite 数据库会更加高效和可靠。


创建数据库和表格


import dataRdb from '@ohos.data.rdb';

let rdbStore;

async function createDatabase() {
    const storeConfig = { name: 'LocalData.db' };
    rdbStore = await dataRdb.getRdbStore(storeConfig);

    const createTableSQL = `
        CREATE TABLE IF NOT EXISTS Data (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            key TEXT UNIQUE,
            value TEXT
        );
    `;
    await rdbStore.executeSql(createTableSQL, []);
}

createDatabase();


插入数据


async function insertData(key, value) {
    const insertSQL = `INSERT OR REPLACE INTO Data (key, value) VALUES (?, ?);`;
    await rdbStore.executeSql(insertSQL, [key, JSON.stringify(value)]);
}


查询数据


async function queryData(key) {
    const querySQL = `SELECT value FROM Data WHERE key = ?;`;
    const resultSet = await rdbStore.querySql(querySQL, [key]);
    if (resultSet.goToFirstRow()) {
        const value = resultSet.getString(resultSet.getColumnIndex('value'));
        return JSON.parse(value);
    }
    return null;
}

3. 使用 IndexedDB (Web-like)

如果你习惯于 Web 开发环境,可以考虑使用 IndexedDB 的类似 API,通过 Polyfill 或者第三方库来实现。



根据你的需求和数据量,可以选择不同的本地存储方式:


文件存储:适用于简单的大数据存储和读取操作。

SQLite 数据库:适用于复杂的数据结构,需要频繁增删改查操作的场景。

IndexedDB:如果你习惯于 Web 环境,可以使用类 Web 的 API 操作本地数据。

已于2024-7-9 19:14:38修改
分享
微博
QQ
微信
回复
2024-07-09 19:14:17
droidzxy

如果是键值型的,试试键值型数据库呢,


约束限制

  • 设备协同数据库,针对每条记录,Key的长度≤896 Byte,Value的长度<4 MB。
  • 单版本数据库,针对每条记录,Key的长度≤1 KB,Value的长度<4 MB。
  • 每个应用程序最多支持同时打开16个键值型分布式数据库。
  • 键值型数据库事件回调方法中不允许进行阻塞操作,例如修改UI组件。


参考

​​​​https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/data-persistence-by-kv-store-V5​


分享
微博
QQ
微信
回复
2024-07-09 15:08:52
相关问题
如何PixelMap数据存储数据库中
1864浏览 • 1回复 待解决
HarmonyOS如何进行数据文件存储
423浏览 • 1回复 待解决
HarmonyOS 本地存储数据用什么?
177浏览 • 1回复 待解决
FA卡片如何进行数据交互
2176浏览 • 1回复 待解决
手机如何与电脑进行数据传输
3333浏览 • 1回复 待解决
数据存储方案如何选择?
182浏览 • 0回复 待解决
数据存储方案如何选择
374浏览 • 1回复 待解决
分布式存储数据方法
413浏览 • 1回复 待解决
如何easymock数据插入数据库?
2425浏览 • 1回复 待解决