SharedPreferences 的另一种场景的用法
SharedPreferences 的另一种场景的用法
昨天,下班在家想做什么来着,然后想用
SharedPreferences存点数据,但是不知道咋地突然想到,SharedPreferences是应用启动时一次性加到内存里的.适合少量的存储,多的话还是用数据库吧.实际项目中都是数据库,我私下写写demo就不搞那么麻烦了=.=然后,问题来了,如果我要使用
SharedPreferences,如何在比较小的单位里存储更多的信息.
好了,正题.
1. 昨天谷歌提供了国内的 android developer官网!!!
{=.=} 激动!!!
你的书签地址还是 https://developer.android.com/index.html ???{大雾}
国内速度更快!!!地址:https://developer.android.google.cn/index.html{快快加书签!!!}
2. 最近同事推荐了款 Markdown 编辑器,感觉比我之前用的 MarkdownPad2好用
分享下,名字: Haroopad
顺便丢个自己的GitHub仓库,收集了一些开发必须的工具,需要的可以去看看,顺便 watch fuck star...
开发日常应该必备吧(今天发现的hosts不错,YouTube也可以看,已经提供了七牛云下载) https://github.com/didikee/Dev_Tools
3. 我擦,真 正题...
思路:
想起之前看源码的时候谷歌用二进制存储
boolean值,然后我想了想,貌似可以用String存一些值.例如:"10101101": 可以解读为:
true false true false true true false true
但是,"1"也是一个字符,它不限于"1",也可以是2或3甚至*或者%等等字符就可以.
1. 定义 Value:
Value:是一些char类型的值,代表一些含义.我简单的定义了四种:
public abstract class SPValue {
public static final char TRUE='1';//true
public static final char FALSE='0';//false
public static final char DEFAULT='-';//默认的时候会是'-'
public static final char ERROR='=';//发生错误的时候可能会用'='
}
2. 定义 Key:
Key:是由 **0 ~ Integer.MaxValue() **,其实就是String的脚标index.
public abstract class SPKey {
//抽象类,给子类继承
}
3. 提供 get 和 put 功能
定义功能接口:
public interface ISPDao {
char getValue(int key);
void putValue(int key,char value);
}
最后是实现类:
public final class SPDao implements ISPDao {
private final Context context;
public static final String SPDAO = "spDao";
public static final String SPKEY = "spKey";
public SPDao(Context context) {
this.context = context;
}
@Override
public char getValue(int key) {
SharedPreferences sp = context.getSharedPreferences(SPDAO,
Context.MODE_PRIVATE);
String allValues = sp.getString(SPKEY, "");
Log.e("test","get: "+allValues);
String defaultStr = String.valueOf(SPValue.DEFAULT);
int maxIndex = allValues.length() - 1;
if (key > maxIndex) {
SharedPreferences.Editor editor = sp.edit();
String tempAdd = "";
for (int i = maxIndex + 1; i <= key; i++) {
tempAdd += defaultStr;
}
editor.putString(SPKEY, allValues + tempAdd);
editor.apply();
return SPValue.DEFAULT;
} else {
return allValues.charAt(key);
}
}
@Override
public void putValue(int key, char value) {
SharedPreferences sp = context.getSharedPreferences(SPDAO,
Context.MODE_PRIVATE);
String allValues = sp.getString(SPKEY, "");
Log.e("test","put start: "+allValues);
String defaultStr = String.valueOf(SPValue.DEFAULT);
SharedPreferences.Editor editor = sp.edit();
int maxIndex = allValues.length() - 1;
if (key > maxIndex) {
String tempAdd = "";
for (int i = maxIndex + 1; i <= key; i++) {
tempAdd += defaultStr;
}
Log.e("test","put end1: "+allValues+ tempAdd);
editor.putString(SPKEY, allValues+tempAdd);
} else {
char oldChar = allValues.charAt(key);
Log.e("test","oldCar: "+oldChar);
StringBuilder sb=new StringBuilder(allValues);
sb.setCharAt(key,value);
Log.e("test","put end2: "+ sb.toString());
editor.putString(SPKEY, sb.toString());
}
editor.apply();
}
}
说明:中间的if作用是,如果你要获取脚标 4 的char值,但是目前String长度只有 3 ,那么我就填充String 到index 4,填充的值"DEFAULT"
值.同理,我在put的时候也会做这样的处理.
最后就是Key的值其实是0开始,建议是连续的,因为不是连续的话,那么必然会有一些index的占位是无意义的,至于我最开始的思路是相违背的.
4.最后提供一个检测 key 是否重复定义的工具类
思路: 用反射得到所有的定义的key,然后比较是否重复,重复的话意味着同一个脚标index同时代表了两种含义,这是不被允许的.
代码:
public class SPDaoChecker {
private static final String CHANGE="$change";
private static final String SERIAL_VERSION_UID="serialVersionUID";
/**
* check your SPKeys
* @param clz class extend SPKey
* @return
*/
public static boolean check(Class clz){
ArrayList<Integer> charList=new ArrayList();
Field[] fields = clz.getFields();
for (Field field : fields) {
String name = field.getName();
if (SERIAL_VERSION_UID.equalsIgnoreCase(name)
|| CHANGE.equalsIgnoreCase(name)){
continue;
}
boolean accessible = field.isAccessible();
if (!accessible)field.setAccessible(true);
int value= -1;
try {
value = field.getInt(clz.newInstance());
} catch (Exception e){
Log.d("test","e: "+e.getClass().getSimpleName()+"msg: "+e.getMessage());
return false;
}
if (charList.contains(value)){
return false;
}else {
charList.add(value);
}
Log.d("test","name: "+name+"value: "+value);
}
return true;
}
}
好了,差不多说完了,有什么不对的地方轻拍,你也不会打我的对不对?嘿嘿
代码地址:
(欢迎fuck 我
的代码)
https://github.com/didikee/SharedPreferencesDao
SharedPreferences 的另一种场景的用法的更多相关文章
- (转)extern关键字两种场景的使用
第一种场景 -- extern extern关键字的作用是声明变量和函数为外部链接,即该变量或函数名在其它文件中可见.用其声明的变量或函数应该在别的文件或同一文件的其它地方定义. 例如语句:exter ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- 一直被用错的6种SQL 错误用法
一直被用错的6种SQL 错误用法 1.LIMIT 语句 2.隐式转换 3.关联更新.删除 4.EXISTS语句 5.条件下推 6.提前缩小范围 sql语句的执行顺序: FROM ON JOIN WHE ...
- MySQL常见的8种SQL错误用法
MySQL常见的8种SQL错误用法 前言 MySQL在2016年仍然保持强劲的数据库流行度增长趋势.越来越多的客户将自己的应用建立在MySQL数据库之上,甚至是从Oracle迁移到MySQL上来.但也 ...
- [转]jQuery的each方法的几种常用的用法
下面提一下jQuery的each方法的几种常用的用法 复制代码 代码如下: var arr = [ "one", "two", "three&quo ...
- iOS容易造成循环引用的三种场景
iOS容易造成循环引用的三种场景 ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露.导致iOS对象无法按预期释放的一个无形杀手是--循环引用.循环引用可以简单理解为 ...
- 避免常见的6种HTML5错误用法
一.不要使用section作为div的替代品 人们在标签使用中最常见到的错误之一就是随意将HTML5的<section>等价于<div>——具体地说,就是直接用作替代品(用于样 ...
- Java 枚举(enum) 详解7种常见的用法
Java 枚举(enum) 详解7种常见的用法 来源 https://blog.csdn.net/qq_27093465/article/details/52180865 JDK1.5引入了新的类型— ...
- C#保留2位小数几种场景总结 游标遍历所有数据库循环执行修改数据库的sql命令 原生js轮盘抽奖实例分析(幸运大转盘抽奖) javascript中的typeof和类型判断
C#保留2位小数几种场景总结 场景1: C#保留2位小数,.ToString("f2")确实可以,但是如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.2 ...
随机推荐
- 梅须逊雪三分白,雪却输梅一段香——CSS动画与JavaScript动画
CSS动画并不是绝对比JavaScript动画性能更优越,开源动画库Velocity.js等就展现了强劲的性能. 一.两者的主要区别 先开门见山的说说两者之间的区别. 1)CSS动画: 基于CSS的动 ...
- 为你的Web程序加个启动画面
.Net开发者一定熟悉下面这个画面: 这就是宇宙第一IDE Visual Studio的启动画面,学名叫Splash Screen(或者Splash Window).同样,Javar们一定对Eclip ...
- 【夯实PHP基础】UML序列图总结
原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...
- MyBatis源码分析(二)语句处理器
StatementHandler 语句处理器,主要负责语句的创建.参数的设置.语句的执行.不负责结果集的处理. Statement prepare(Connection connection, Int ...
- 解决 Could not find com.android.tools.build:gradle 问题
今天拉同事最新的代码,编译时老是报如下错误: Error:Could not find com.android.tools.build:gradle:2.2.0.Searched in the fol ...
- React Native环境配置之Windows版本搭建
接近年底了,回想这一年都做了啥,学习了啥,然后突然发现,这一年买了不少书,看是看了,就没有完整看完的.悲催. 然后,最近项目也不是很紧了,所以抽空学习了H5.自学啃书还是很无趣的,虽然Head Fir ...
- TFS 2015 敏捷开发实践 – 看板的使用
看板在现代应用开发过程中使用非常广泛,不管是使用传统的瀑布式开发还是敏捷开发,都可以使用看板管理.因为看板拥有简单的管理方法,直观的显示方式,所以很多软件开发团队选择使用看板进行软件开发管理.本文不在 ...
- 企业shell面试题:获取51CTO博客列表倒序排序考试题
#!/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin HTMLFILE=/home/oldboy/ht ...
- 烂泥:jira7.2安装、中文及破解
. jira的主要配置文件,存放在/opt/atlassian/jira/conf/server.xml文件中,如下: vim /opt/atlassian/jira/conf/server.xml ...
- 把int*传值给char*,打印出错误的数字
首先进入debug模式查看i的地址也就是ptr的值 以16进制位小端模式存储(一个整型四个字节,8位16进制数)(根据系统位数情况) 紧接着因为ptr是char*型指针变量,读取数据时按照一个字节一个 ...