需求

1.本地存储数据。
2.在连接上服务器后可以完成移动端和服务端之间的数据同步。

解决方案

  • uni-app 框架中使用plus.io.requestFileSystem技术完成数据在手机端的持久化处理。

代码

  1. plus.io.requestFileSystem代码
let addr = "/storage/emulated/0/database/";

export default {
	storage(className, data) {
		plus.io.requestFileSystem(
			plus.io.PRIVATE_DOC, // 程序私有文档目录常量
			fs => {
				// 创建或打开文件, fs.root是根目录操作对象,直接fs表示当前操作对象
				fs.root.getFile(
					addr + className, 
					{create: true},// 文件不存在则创建
					fileEntry => {
						// 文件在手机中的路径
						fileEntry.createWriter(writer => {
							// 写入文件成功完成的回调函数
							writer.onwrite = e => {
								//console.log('写入成功');
							};
							// 向文件中写入数据
							writer.write(
								JSON.stringify(data)
							);
						});
					},
					e => {
						console.log('getFile failed: ', e);
					}
				);
			},
			e => {
				console.log(e.message);
			}
		);
	},
	read(className) {
		let that = this;
		return new Promise((resolve, reject) => {
			plus.io.requestFileSystem(
				plus.io.PRIVATE_DOC,
				fs => {
					fs.root.getFile(
						addr + className, 
						{create: false},
						fileEntry => {
							fileEntry.file(function(file) {
								//console.log('文件大小:' + file.size + '-- 文件名:' + file.name);
								//创建读取文件对象
								let fileReader = new plus.io.FileReader();
								//以文本格式读取文件数据内容
								fileReader.readAsText(file, 'utf-8');
								//文件读取操作完成时的回调函数
								fileReader.onloadend = function(evt) {
									resolve(evt.target.result)
								};
							});
						},
						e => {
							reject(e);
						}
					);
				},
				e => {
					reject(e);
					console.log(e.message);
				}
			);
		})
	}
}
  1. end

权限配置

在manifest.json文件中,添加权限。

{
    ...,
    /* 5+App特有相关 */
    "app-plus" : {
        ...,
        "distribute" : {
            /* android打包配置 */
            "android" : {
                "permissions" : [
                    ...,
                    "<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
                    ...
                ]
            },
           ...
        }
    },
    ...
}

踩坑记录

  1. 无法写入,异常提示为:{ “code”: 10, “message”: “执行出错”}
    答:可能是因为权限没有开通,需要开通存储空间权限。
  2. end
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐