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...
ConcurrentHashMapHashMap都是Java中的Map接口的实现类。它们的主要区别在于线程安全性和并发性。 HashMap是非线程安全的,如果多个线程同时访问HashMap,可能会导致数据不一致的问题。而ConcurrentHashMap是线程安全的,它使用了锁分段技术,将整个Map分成多个段,每个段都有自己的锁,不同的线程可以同时访问不同的段,从而提高了并发性。 另外,ConcurrentHashMap的迭代器是弱一致性的,即它可以在迭代过程中映出其他线程对Map的修改,但不保证一定能够映出最新的修改。而HashMap的迭代器是快速失败的,即在迭代过程中如果其他线程对Map进行了修改,就会抛出ConcurrentModificationException异常。 总之,如果需要在多线程环境下使用Map,应该使用ConcurrentHashMap,而在单线程环境下使用Map,可以使用HashMap