一般我们需要用到SharedPreferences来存储简单的配置项,比如说Boolean、String、Float、Long或Int值,这些值存储之后,在下次打开应用的时候就能取出来,然后采取相应的措施。
当我们需要存储复杂的数据的时候,api当中引入了Set,这是一种集合,跟List类似,只是不能存储重复变量,而且是无序的。
以上就是google开发指南的说明。
public void addone(String string){
channelSet.add(string); //channelSet是外部的一个Set<String>
SharedPreferences.Editor spEditor = getSharedPreferences("ninitest", 0).edit();
spEditor.putStringSet("channelSet", channelSet);
spEditor.commit();
}
上面是一个测试用的方法,就是将set增加一个字符串之后重新写入到本地,这个方法在第一次调用的时候还是可以写入的,但是之后调用,就不能写入了。下面是google给出的getStringSet的注意事项:
不能更新的问题就出在getStringSet的object和putStringSet的object不能是同一个,不能在get之后,进行更改,然后又put进去,这样是无法更改的。
解决办法:
public void addone2(String string){
channelSet = new HashSet<String>(channelSet);
channelSet.add(string);
SharedPreferences.Editor spEditor = getSharedPreferences("ninitest", 0).edit();
spEditor.putStringSet("channelSet", channelSet);
spEditor.commit();
}
增加了一句channelSet = new HashSet<String>(channelSet);
new 了一个HashSet,并且channelSet还是原来的channelSet,但是这个channelSet已经是一个全新的object了,然后每次更新都能将数据写入进去了。这是对数据本身进行操作,还有其他办法,就是对SharedPreferences的Editor进行操作:
- 在putStringSet之前先清空Editor,即
editor.clear()
。
- editor增加一个数据项,在putStringSet后面再写个putString,这个putString里面可以是Set的size等等。
上面两种对editor进行操作的方法也能解决这个问题。