使用前提,你得是基本熟悉harmonyOS next Stroge 开发
为啥要写这个封装?
作为一个前端开发,用户首选项功能等同于前端LocalStorage功能,如果按他们文档来,使用起来实在绕口(手),故将这个方法封装一下,以达到类似前端使用local storage功能,当然,你也可以把它当做store使用哈哈哈
接下来,show you the code...
先要在entryability/EntryAbility.ets中声明,这步根据教学视频好像是必要的,至于为啥,那就不清楚了哈哈哈
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
//使用用户首选项第一步,先创建用户首选项
let options:preferences.Options={name:'myStore'}//这里命名可以自己定义,当然你可以通过Resource或命名文件来统一管理,我这里就简化了,直接写死,不影响使用
preferences.getPreferences(this.context,options)
}
创建一个文件,例如GlobalContext.ets,在里面写封装方法,因为用户首选项的异步特性,所有方法都是异步执行的,使用的时候会详细说明
class LocalStorage {
public getKvStore(): Promise<distributedKVStore.SingleKVStore> {
let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION | bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_METADATA;
let info_: bundleManager.BundleInfo = bundleManager.getBundleInfoForSelfSync(bundleFlags)
let kvManagerConfig: distributedKVStore.KVManagerConfig = {
context: getContext(that),
bundleName: info_.name
};
let kvManager: distributedKVStore.KVManager = distributedKVStore.createKVManager(kvManagerConfig)
return new Promise((resolve: Function, reject: Function) => {
try {
const options: distributedKVStore.Options = {
createIfMissing: true, // 当数据库文件不存在时是否创建数据库,默认创建
encrypt: false, // 设置数据库文件是否加密,默认不加密
backup: false, // 设置数据库文件是否备份,默认备份
kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION, // 设置要创建的数据库类型,默认为多设备协同数据库
securityLevel: distributedKVStore.SecurityLevel.S2 // 设置数据库安全级别
};
// storeId为数据库唯一标识符
kvManager.getKVStore('storeId', options, (err, kvStore: distributedKVStore.SingleKVStore) => {
if (err) {
console.error(`Failed to get KVStore. Code:${err.code},message:${err.message}`);
reject('err')
return;
}
console.info('Succeeded in getting KVStore.');
// 进行相关数据操作
resolve(kvStore)
});
} catch (e) {
reject('err')
console.error(`An unexpected error occurred. Code:${e.code},message:${e.message}`);
}
})
}
getItem(value: string): Promise<string | Object | number | boolean | null | undefined> {
return new Promise((resolve: Function, reject: Function) => {
//用户首选项操作
preferences.getPreferences(getContext(this), 'myStore').then((obj: preferences.Preferences) => {
obj.has(value).then(async (isExit: Boolean) => {
// console.info('isExit:' + isExit)
if (!isExit) {
resolve('')
} else {
let res: preferences.ValueType = await obj.get(value, '');
// console.log(res+'454545'+value)
resolve(res)
}
}).catch((err: Error) => {
reject(JSON.stringify(err))
})
}).catch((err: Error) => {
reject(JSON.stringify(err))
})
})
}
setItem(value: string, data: preferences.ValueType): Promise<null> {
return new Promise((resolve: Function) => {
preferences.getPreferences(getContext(this), 'myStore').then((obj: preferences.Preferences) => {
obj.has(value).then(async (isExit: Boolean) => {
// console.info('isExit:' + isExit)
obj.put(value, data)
obj.flush()
resolve(null)
})
})
})
}
clearItem(): Promise<null> {
return new Promise((resolve: Function) => {
preferences.deletePreferences(getContext(this), 'myStore', (err: BusinessError) => {
if (err) {
console.error("Failed to delete preferences. code =" + err.code + ", message =" + err.message);
return;
}
resolve(null)
console.info("Succeeded in deleting preferences.");
})
})
}
//启用键值对数据库处理
getBigItem(value: string): Promise<string> {
return new Promise((resolve: Function) => {
this.getKvStore().then((kvStore: distributedKVStore.SingleKVStore) => {
try {
kvStore.get(value, (err, data) => {
if (err !== undefined) {
console.error(`Failed to get data. Code:${err.code},message:${err.message}`);
resolve('')
return;
}
// console.info(`Succeeded in getting data. data:${data}`);
resolve(data)
});
} catch (e) {
let error = e as BusinessError;
console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`);
resolve('')
}
})
})
}
//设置值
setBigItem(value: string, data: string): Promise<string> {
return new Promise((resolve: Function) => {
this.getKvStore().then((kvStore: distributedKVStore.SingleKVStore) => {
try {
kvStore.put(value, data, (err) => {
if (err !== undefined) {
console.error(`Failed to put data. Code:${err.code},message:${err.message}`);
resolve('')
return;
}
resolve('success')
console.info('Succeeded in putting data.');
});
} catch (e) {
let error = e as BusinessError;
console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`);
resolve('')
}
})
})
}
//删除
deleteBigItem(value: string): Promise<string> {
return new Promise((resolve: Function) => {
this.getKvStore().then((kvStore: distributedKVStore.SingleKVStore) => {
kvStore.delete(value, (err) => {
if (err !== undefined) {
console.error(`Failed to delete data. Code:${err.code},message:${err.message}`);
resolve('')
return;
}
resolve('success')
console.info('Succeeded in deleting data.');
})
})
})
}
}
export const localStorage=new LocalStorage()
使用
//引用,这个不得不说DevEco Studio是真心方便,上面文件方法写完导出后,代码中使用时可以直接输入方法名会给出提示,并自动给你import上,不用再自己写路径。这个功能真心好评!
import { localStorage } from '../../until/GlobalContext';
//这里是在你的需求里面去使用,比如我在输入完手机号之后需要保存手机号,当然,可以存字符串,对象等,见GlobalContext.ets
//存数据
localStorage.setItem('mobile',this.mobile)//一定要注意这是个异步函数,如果你需要在这执行完成后再执行其他操作,一定要异步处理!
//拿数据
localStorage.getItem('mobile').then((data)=>{
console.log(JSON.stringify(data))
if(typeof data=='string')this.mobile=data
})
//或(函数为异步函数时)
let mobile=await localStorage.getItem('mobile')
if(typeof mobile=='string')this.mobile=mobile
其中调用clearItem 会删除所有用户首选项的数据
//一下是键值对数据处理的封装,处理超过8K数据的信息
getBigItem
setBigItem
deleteBigItem//这里只会删除对应的数据,不会全部删除,所以要传一个值去确定删哪个数据
以上就是完整使用方法。仅供参考,自测实用,(用户首选项需要在真机调试下才能查看到数据,预览器不支持)