Android 持久化数组(List/ArrayList)方法---MMKV

说明:

 

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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值