public static byte[] serialize(HashMap
hashMap){
try {
ByteArrayOutputStream mem_out = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(mem_out);
out.writeObject(hashMap);
out.close();
mem_out.close();
byte[] bytes = mem_out.toByteArray();
return bytes;
} catch (IOException e) {
return null;
public static HashMap deserialize(byte[] bytes){
try {
ByteArrayInputStream mem_in = new ByteArrayInputStream(bytes);
ObjectInputStream in = new ObjectInputStream(mem_in);
HashMap hashMap = (HashMap)in.readObject();
in.close();
mem_in.close();
return hashMap;
} catch (StreamCorruptedException e) {
return null;
} catch (ClassNotFoundException e) {
return null;
} catch (IOException e) {
return null;
2.定义一个方法获取学生的信息,其中家庭成员信息保存在hashmap后,序列化到sqlite
public ArrayList<ContentValues> formatStudentInfo() {
ArrayList<ContentValues> valueArr = null;
ContentValues values = null;
HashMap<String, String> map = null;
valueArr = new ArrayList<ContentValues>();
//第一组数据
values = new ContentValues(3);
values.put("name", "david");
values.put("class","0502");
map = new HashMap<String, String>();
map.put("mom", "lucy");
map.put("dad", "jack");
byte[] bytes = SerializableInterface.serialize(map);
values.put("family", bytes);
valueArr.add(values);
//第二组数据
values = new ContentValues(3);
values.put("name", "joy");
values.put("class","0502");
map = new HashMap<String, String>();
map.put("mom", "mary");
map.put("dad", "json");
bytes = SerializableInterface.serialize(map);
values.put("family", bytes);
valueArr.add(values);
return valueArr;
3.调用数据库的操作类将
formatStudentInfo返回的数据insert到数据库。
这个方法应该放在自己写的继承了SQLiteOpenHelper的类中
public void insertAll(String databaseName,
ArrayList<ContentValues> valuesArr) {
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
for (ContentValues val : valuesArr) {
db.insert(databaseName, null, val);
db.setTransactionSuccessful();
db.endTransaction();
db.close();
读取的时候调用
Cursor cursor db.query("fix your self");
.......
//通过getBlob方法获取bytes后反序列化得到map对象,参数x是序列化字段所在的列数(从0开始计数)。
byte[] bytes = cursor.getBlob(x);
HashMap<String, String> map = SerializableInterface.deserialize(bytes);
以上仅是对序列化与反序列化HashMap对象做一个简单的介绍,代码并不完整,数据库操作部分需要自己补充完整。
1.首先给出序列化与反序列化工具类public class SerializableInterface { public SerializableInterface(){ } public static byte[] serialize(HashMap hashMap){ try { ByteArrayOutputStream mem_out = ne
就像 《Android SQLiteStatement 编译、执行 分析》 中所说的,SQLite中所有SQL语句都需要先编译为stmt,然后执行。
上述文章介绍了SQLiteStatement在android层面的编译执行。然而,类SQLiteStatement只能用以执行无返回值或者只有一行一列(1X1)的sql语句,例如INSERT ALERT 等,而像SELECT这种返回结果可能多行多列的则不适用。
android对select提供了专门的执行方法rawQuery(),对其也有特殊的SQLiteQu
IPC获取Cursor原理、Cursor读取原理
了解通过ContentProvider获取Cursor的原理以及过程中一些关键点;了解Client在拿到Cursor资源对象后获取其中内容、移动游标位置的原理。
自定义Cursor
如何通过ContentProvider返回一个自定义Cursor。
IPC获取Cursor...
ConcurrentHashMap和HashMap都是Java中的Map接口的实现类。它们的主要区别在于线程安全性和并发性。
HashMap是非线程安全的,如果多个线程同时访问HashMap,可能会导致数据不一致的问题。而ConcurrentHashMap是线程安全的,它使用了锁分段技术,将整个Map分成多个段,每个段都有自己的锁,不同的线程可以同时访问不同的段,从而提高了并发性。
另外,ConcurrentHashMap的迭代器是弱一致性的,即它可以在迭代过程中反映出其他线程对Map的修改,但不保证一定能够反映出最新的修改。而HashMap的迭代器是快速失败的,即在迭代过程中如果其他线程对Map进行了修改,就会抛出ConcurrentModificationException异常。
总之,如果需要在多线程环境下使用Map,应该使用ConcurrentHashMap,而在单线程环境下使用Map,可以使用HashMap。