看了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 

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返回了。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐