Android源码分析------SQLiteDatabase(1)

看了SQLiteDatabase的replace接口的源码,感受写的很好,有些能够借鉴的地方,记录以下:java

    public long replace(String table, String nullColumnHack, ContentValues initialValues) {
        try {
            return insertWithOnConflict(table, nullColumnHack, initialValues,
                    CONFLICT_REPLACE);   //最后一个参数是为了指明静态数组的某个index值,没有处理空指针
        } catch (SQLException e) {
            Log.e(TAG, "Error inserting " + initialValues, e);     //异常时,以Log.e打印出来
            return -1;                 //异常时返回-1
        }
    }

    public long insertWithOnConflict(String table, String nullColumnHack,
            ContentValues initialValues, int conflictAlgorithm) {
        acquireReference();
        try {
            StringBuilder sql = new StringBuilder();      //sql的组装采用StringBuilder
            sql.append("INSERT");
            sql.append(CONFLICT_VALUES[conflictAlgorithm]);   //此处组装的字符串以静态数据中的某个值
            sql.append(" INTO ");
            sql.append(table);
            sql.append('(');

            Object[] bindArgs = null;
            int size = (initialValues != null && initialValues.size() > 0)
                    ? initialValues.size() : 0;             //获取列表或者数组的大小能够用这种方式
            if (size > 0) {
                bindArgs = new Object[size];
                int i = 0;
                for (String colName : initialValues.keySet()) {
                    sql.append((i > 0) ? "," : "");            //组装代码时,逗号能够用这种语句组装
                    sql.append(colName);
                    bindArgs[i++] = initialValues.get(colName);
                }
                sql.append(')');
                sql.append(" VALUES (");
                for (i = 0; i < size; i++) {
                    sql.append((i > 0) ? ",?" : "?");
                }
            } else {
                sql.append(nullColumnHack + ") VALUES (NULL");     //空指针的处理
            }
            sql.append(')');

            SQLiteStatement statement = new SQLiteStatement(this, sql.toString(), bindArgs);
            try {
                return statement.executeInsert();
            } finally {
                statement.close();
            }
        } finally {
            releaseReference();
        }
    }

    SQLiteDatabase的replace接口组装了SQL语句的insert or replace功能,有不少值得借鉴的地方:android

一、SQLiteDatabase的不一样接口,好比insert、replace等,都调用到一个具体实现的方法insertWithOnConflict,作到接口与实现的分离;sql

二、在接口中没有对空指针进行处理,在具体实现的方法中对参数进行了处理。第一个参数table,没有进行空指针判断,由于表名是null也是能够的,nullColumnHack和initialValues的空值也有相应处理数组

三、异常时,android中要用Log.e打印出来;app

四、有long型返回值时,能够用-1做为异常时的返回值;ui

五、sql数组的组装采用的是StringBuilder;this

六、在处理列表或者数组类型的对象时,常常要进行null和大小为0的判断,能够参照这种方式写:spa

 int size = (initialValues != null && initialValues.size() > 0)
                    ? initialValues.size() : 0;

七、组装代码时,常常会遇到用逗号或者其余符号进行分隔组装的问题,能够采用以下方式:
指针

sql.append((i > 0) ? "," : "");

八、return与finally的关系:code

 try {
     return statement.executeInsert();
 } finally {
     statement.close();
 }

  以上代码的执行顺序是:

  1) statement.executeInsert()

  2) statement.close()

  3) return

  就是说,代码顺序地执行着,走着走着,走到statement.executeInsert()执行完时,发现了return,原来本身快over了,临死前,它去找finally,让finally把事情作完。等finally作完,执行return返回了。

相关文章
相关标签/搜索