博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android源码分析------SQLiteDatabase(1)
阅读量:5845 次
发布时间:2019-06-18

本文共 3044 字,大约阅读时间需要 10 分钟。

看了SQLiteDatabase的replace接口的源码,感觉写的很好,有些可以借鉴的地方,记录如下:

    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功能,有很多值得借鉴的地方:

1、SQLiteDatabase的不同接口,比如insert、replace等,都调用到一个具体实现的方法insertWithOnConflict,做到接口与实现的分离;

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

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

4、有long型返回值时,可以用-1作为异常时的返回值;

5、sql数组的组装采用的是StringBuilder;

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

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

7、组装代码时,经常会遇到用逗号或者其他符号进行分隔组装的问题,可以采用如下方式:

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

8、return与finally的关系:

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

  以上代码的执行顺序是:

  1) statement.executeInsert()

  2) statement.close()

  3) return

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

转载于:https://my.oschina.net/tingzi/blog/186368

你可能感兴趣的文章
Linux PID 1 和 Systemd
查看>>
一元多项式相加
查看>>
commandLink/commandButton/ajax backing bean action/listener method not invoked (转)
查看>>
软件工作的大环境
查看>>
梅沙教育APP简单分析-版本:iOS v1.2.21-Nathaneko-佳钦
查看>>
Word中如何设置图片与段落的间距为半行
查看>>
JQuery this和$(this)的区别及获取$(this)子元素对象的方法
查看>>
关于分区索引与全局索引性能比较的示例
查看>>
C语言之指针与数组总结
查看>>
沟通:用故事产生共鸣
查看>>
1080*1920 下看网站很爽
查看>>
Android类参考---Fragment(一)
查看>>
CMake 构建项目Android NDK项目基础知识
查看>>
MySQL 不落地迁移、导入 PostgreSQL - 推荐 rds_dbsync
查看>>
[Erlang 0004] Centos 源代码编译 安装 Erlang
查看>>
51 Nod 1027 大数乘法【Java大数乱搞】
查看>>
三维重建技术概述
查看>>
AI x 量化:华尔街老司机解密智能投资正确姿势
查看>>
IT史上十大收购案
查看>>
数据切分——Atlas介绍
查看>>