说明:
1、我是从iOS转Android开发 现在应该是两个多月了吧 Android、iOS来回搞还好点 要是Android一段时间没去编码 那么感觉忘记挺快 第一篇Android文章记录一下
2、轻量级的持久化保存我iOS最开始是使用NSUserDefault,但是这个系统持久化存储方法用的多了就会知道不好用,除了读写速度慢有时候好像还会丢,Android的SharedPreferences似乎也不太好用。在一次偶然的情况下,发现微信使用的持久化存储框架MMKV,这个用起来感觉就很舒服。Android和iOS我都统一使用了该框架进行持久化存储。
使用方法
iOS:
1、在Appdelegate中的didFinishLaunchingWithOptions方法中实例化MMKV,kLibraryDirectoryPath是我写的 一个路径 的 宏定义
[MMKV initializeMMKV:[kLibraryDirectoryPath stringByAppendingPathComponent:@"mmkv"]];
2、在全局文件pch中定义宏
#define kLibraryDirectoryPath [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject]
#define mmkv [MMKV defaultMMKV]
3、使用方法
set方法
get方法
NSString value = [mmkv getStringForKey:key];
BOOL value = [mmkv getBoolForKey:key];
NSMutableArray *history = [NSMutableArray arrayWithArray:[mmkv getObjectOfClass:[NSArray class] forKey:@"search"]];//获取历史记录
[mmkv setObject:[NSMutableArray array] forKey:@"search"]; //清除历史记录
[mmkv setObject:history forKey:@"search"];//保存历史记录
重要说明:如果mmkv保存的object类型,这里我保存的是数组,数组里面如果实体类那么实体类必须实现NSCoding协议 。
举例代码如下
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface WiFiDeviceInfo : NSObject<NSCoding>
@property(nonatomic,assign)int port;
@property(nonatomic,strong)NSString *ip_address;
@property(nonatomic,strong)NSString *name;
@property(nonatomic,strong)NSString *uuid;
@end
NS_ASSUME_NONNULL_END
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeInt:_port forKey:@"port"];
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeObject:_uuid forKey:@"uuid"];
[aCoder encodeObject:_ip_address forKey:@"ip_address"];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
if (self == [super init]) {
_port = [aDecoder decodeIntForKey:@"port"];
_name = [aDecoder decodeObjectForKey:@"name"];
_uuid = [aDecoder decodeObjectForKey:@"uuid"];
_ip_address = [aDecoder decodeObjectForKey:@"ip_address"];
}
return self;
}
- (BOOL)isEqual:(WiFiDeviceInfo *)other{ //NSCoding协议不包括这个方法
if (!other) {
return false;
}
return [self.uuid isEqualToString:other.uuid];
}
@end
iOS 使用方法已经介绍完,下面介绍Android用法
Android
1、导包:
//lxy implementation 'com.tencent:mmkv:1.2.8'
2、Application中实例化
MMKV.initialize(this);
3、使用方法
//保存 MMKV.defaultMMKV().encode(key, stringValue); //保存String类型 MMKV.defaultMMKV().encode(key,boolValue);//保存bool类型//获取
String value= MMKV.defaultMMKV().decodeString(key);
bool value= MMKV.defaultMMKV().decodeBool(key);
保存实体类数组
private void saveMsg(WiFiDeviceInfo msg){
ArrayList<WiFiDeviceInfo> dataArr = new Gson().fromJson(MMKV.defaultMMKV().decodeString("WiFiContent"), new TypeToken<ArrayList<WiFiDeviceInfo>>() {
}.getType());
if (dataArr == null) {
dataArr = new ArrayList<>();
}
dataArr.add(msg);
Gson gson = new Gson();
MMKV.defaultMMKV().encode("WiFiContent",gson.toJson(dataArr));
}
获取实体类数组
private ArrayList<WiFiDeviceInfo> saveArray(){
ArrayList<WiFiDeviceInfo> dataArr = new Gson().fromJson(MMKV.defaultMMKV().decodeString("WiFiContent"), new TypeToken<ArrayList<WiFiDeviceInfo>>() {
}.getType());
if (dataArr!=null)return dataArr;
return new ArrayList();
}
其中实体类WiFiDeviceInfo必须要序列化 代码如下
/**
* WiFiLinkMsg
* Create by lxy on 9/2/21 3:25 PM
* Copyright © 2021 lxy. All rights reserved.
**/
public class WiFiDeviceInfo implements Serializable {
public int port;
public String ip_address;
public String name;
public String uuid;
//下面两个方法不用写
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof WiFiDeviceInfo)) return false;
WiFiDeviceInfo that = (WiFiDeviceInfo) o;
return Objects.equals(uuid, that.uuid);
}
@Override
public int hashCode() {
return Objects.hash(port, ip_address, name, uuid);
}
}