android sqlite 分析,Android源码分析------SQLiteDatabase(1)

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

.创建一个DataBaseHelper DataBaseHelper是一个访问SQLite的助类,提供两个方面的功能 1.getReadableDatebase(),getWriteableDatabase()可以获取SQLiteDatabase对象,通过 2.提供了onCreate()和onUpdate()两个回调函数,允许我们常见和升级数据库是进行使用 A、 在SQLiteOpenHelper的子类当中,必须要有的构造函数 B、该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDataBase对象的时候onCreate 二、创建一个实体person类并且给字段和封装 三、创建一个业务类对SQL的CRUD操作 1.getWritableDatabase()和getReadableDatabase()的区别 ,两个方法都可以获取一个用于操作数据库的SQLiteDatabase实例 2.execSQL(增,删,改都是这个方法)和close();android内部有缓存可关闭也不关闭也行,查询rawQuery是方法 3.在分页有到Cursor(游标)取游标下一个值cursor.moveToNext(),用游标对象接数据 "select * from person limit ?,?" person不能加上where 关键字 4.在删除注意:sb.deleteCharAt(sb.length() - 1); 四、AndroidCRUD业务对SQLite的CRUD操作 1.ContentValues对象的使用 2.android内部insert添加数据的方法,而且values这个不给值也必须要执行,而主键是不是null的其他字段的值是为null 3.insert update query delete 五、单元测试类要注意的 AndroidCRUDService curdService = new AndroidCRUDService(this.getContext()); /* * 注意:getContext必须在我们使用前已经注解进去的,在使用前要实力化,而且是使用后才有上下文 *一般设置为局部对象 */ 六、AndroidManifest.xml的配置 <!-- 配置用户类库android.test.runner测试 --> package jll.sqlitedb; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; /** * *@author Administrator DataBaseHelper是一个访问SQLite的助类,提供两个方面的功能 * 1.getReadableDatebase(),getWriteableDatabase()可以获取SQLiteDatabase对象,通过 * 2.提供了onCreate()和onUpdate()两个回调函数,允许我们常见和升级数据库是进行使用 */ public class DataBaseHelper extends SQLiteOpenHelper { // 给一个默认的SQLite的数据库名 private static final String DataBaseName = "SQLite_DB"; private static final int VERSION = 2; // 在SQLiteOpenHelper的子类当中,必须要有的构造函数 public DataBaseHelper(Context context, String name, CursorFacto
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值