3个用于SQLite数据库操作的类 - SQLiteQueryBuilder

SQLiteQueryBuilder

包:android.database.sqlite.SQLiteQueryBuilder

作用:SQL 查询辅助类,在写contentprovider时很适合

例: CallLogProvider实现的query:

private static final HashMap<String, String> sCallsProjectionMap; static { // Calls projection map sCallsProjectionMap = new HashMap<String, String>(); sCallsProjectionMap.put(Calls._ID, Calls._ID); sCallsProjectionMap.put(Calls.NUMBER, Calls.NUMBER); sCallsProjectionMap.put(Calls.DATE, Calls.DATE); sCallsProjectionMap.put(Calls.DURATION, Calls.DURATION); sCallsProjectionMap.put(Calls.TYPE, Calls.TYPE); sCallsProjectionMap.put(Calls.NEW, Calls.NEW); sCallsProjectionMap.put(Calls.CACHED_NAME, Calls.CACHED_NAME); sCallsProjectionMap.put(Calls.CACHED_NUMBER_TYPE, Calls.CACHED_NUMBER_TYPE); sCallsProjectionMap.put(Calls.CACHED_NUMBER_LABEL, Calls.CACHED_NUMBER_LABEL); } public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); int match = sURIMatcher.match(uri); switch (match) { case CALLS: { qb.setTables("calls"); //设置表名 qb.setProjectionMap(sCallsProjectionMap); //设置列名映射 break; } case CALLS_ID: { qb.setTables("calls"); qb.setProjectionMap(sCallsProjectionMap); qb.appendWhere("calls._id="); //构造用于查询的where子句 qb.appendWhere(uri.getPathSegments().get(1)); break; } case CALLS_FILTER: { qb.setTables("calls"); qb.setProjectionMap(sCallsProjectionMap); String phoneNumber = uri.getPathSegments().get(2); qb.appendWhere("PHONE_NUMBERS_EQUAL(number, "); qb.appendWhereEscapeString(phoneNumber); //同appendWhere,可防止SQL注入 qb.appendWhere(mUseStrictPhoneNumberComparation ? ", 1)" : ", 0)"); break; } default: throw new IllegalArgumentException("Unknown URL " + uri); } final SQLiteDatabase db = mDbHelper.getReadableDatabase(); Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder, null); if (c != null) { c.setNotificationUri(getContext().getContentResolver(), CallLog.CONTENT_URI); } return c; }
注意:

qb.setProjectionMap(sCallsProjectionMap);

这个函数的作用是在qb里设置数据库字段的别名, 即用户定义列名->数据库列名,在执行qb.query时可以使用用户定义列名设置projection、selection等。

如果不需要对列名进行映射,可以不调用这个函数。但是如果调用,必须对所有列都进行映射,映射中key和value可以完全相同。以上代码中就是这样,至于为什么还要这么做,等下一步继续研究。。。


BTW: 实现多表join的方法 http://blog.csdn.net/hncjlxf/article/details/6370362

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值