SQLiteQueryBuilder

本文详细介绍了如何使用SQLiteQueryBuilder进行SQL查询,包括设置表名、列名映射及构造where子句等步骤,并通过CallLogProvider的具体实现示例展示了如何构建复杂的查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQLiteDatabase db = mOpenHelper.getReadableDatabase(),得到一个可读的SQLiteDatabase 实例。
Cursor c = qb.querydb, projection, selection, selectionArgs, null,null, orderBy)语句,这个查询类似于一个标准的SQL查询,但是这个查询是SQLiteQueryBuilder 来发起的,而不是SQLiteDatabase 直接发起的,所以在参数方面略有不同。这个函数为 querySQLiteDatabase db, String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder, String limit)下边将各个参数介绍一下。
第一个参数为要查询的数据库实例。
第二个参数是一个字符串数组,里边的每一项代表了需要返回的列名。
第三个参数相当于SQL语句中的where部分。
第四个参数是一个字符串数组,里边的每一项依次替代在第三个参数中出现的问号(?)。
第五个参数相当于SQL语句当中的groupby部分。
第六个参数相当于SQL语句当中的having部分。
第七个参数描述是怎么进行排序。
第八个参数相当于SQL当中的limit部分,控制返回的数据的个数。

 

 

SQLiteQueryBuilder

包:android.database.sqlite.SQLiteQueryBuilder

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

: CallLogProvider实现的query:

1.          private static final HashMap<String, String> sCallsProjectionMap;  

2.          static {  

3.        

4.              // Calls projection map   

5.              sCallsProjectionMap = new HashMap<String, String>();  

6.              sCallsProjectionMap.put(Calls._ID, Calls._ID);  

7.              sCallsProjectionMap.put(Calls.NUMBER, Calls.NUMBER);  

8.              sCallsProjectionMap.put(Calls.DATE, Calls.DATE);  

9.              sCallsProjectionMap.put(Calls.DURATION, Calls.DURATION);  

10.          sCallsProjectionMap.put(Calls.TYPE, Calls.TYPE);  

11.          sCallsProjectionMap.put(Calls.NEW, Calls.NEW);  

12.          sCallsProjectionMap.put(Calls.CACHED_NAME, Calls.CACHED_NAME);  

13.          sCallsProjectionMap.put(Calls.CACHED_NUMBER_TYPE, Calls.CACHED_NUMBER_TYPE);  

14.          sCallsProjectionMap.put(Calls.CACHED_NUMBER_LABEL, Calls.CACHED_NUMBER_LABEL);  

15.      }  

16.    

17.      public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,  

18.              String sortOrder) {  

19.          SQLiteQueryBuilder qb = new SQLiteQueryBuilder();  

20.          int match = sURIMatcher.match(uri);  

21.          switch (match) {  

22.              case CALLS: {  

23.                  qb.setTables("calls");    //设置表名   

24.                  qb.setProjectionMap(sCallsProjectionMap); //设置列名映射   

25.                  break;  

26.              }  

27.    

28.              case CALLS_ID: {  

29.                  qb.setTables("calls");  

30.                  qb.setProjectionMap(sCallsProjectionMap);  

31.                  qb.appendWhere("calls._id=");    //构造用于查询的where子句   

32.                  qb.appendWhere(uri.getPathSegments().get(1));  

33.                  break;  

34.              }  

35.    

36.              case CALLS_FILTER: {  

37.                  qb.setTables("calls");  

38.                  qb.setProjectionMap(sCallsProjectionMap);  

39.                  String phoneNumber = uri.getPathSegments().get(2);  

40.                  qb.appendWhere("PHONE_NUMBERS_EQUAL(number, ");  

41.                  qb.appendWhereEscapeString(phoneNumber);     //appendWhere,可防止SQL注入   

42.                  qb.appendWhere(mUseStrictPhoneNumberComparation ? ", 1)" : ", 0)");  

43.                  break;  

44.              }  

45.    

46.              default:  

47.                  throw new IllegalArgumentException("Unknown URL " + uri);  

48.          }  

49.    

50.          final SQLiteDatabase db = mDbHelper.getReadableDatabase();  

51.          Cursor c = qb.query(db, projection, selection, selectionArgs, nullnull, sortOrder, null);  

52.          if (c != null) {  

53.              c.setNotificationUri(getContext().getContentResolver(), CallLog.CONTENT_URI);  

54.          }  

55.          return c;  

56.      }  

 

注意:

qb.setProjectionMap(sCallsProjectionMap); 

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

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

 

 

 

Settings1970-01-01 00:00:11.176 881 881 W SettingsState: No settings state /data/system/users/0/settings_system.xml 1970-01-01 00:00:11.176 881 881 I SettingsState: directory info for directory/file /data/system/users/0/settings_system.xml with stacktrace 1970-01-01 00:00:11.176 881 881 I SettingsState: java.lang.Exception 1970-01-01 00:00:11.176 881 881 I SettingsState: at com.android.providers.settings.SettingsState.logSettingsDirectoryInformation(SettingsState.java:892) 1970-01-01 00:00:11.176 881 881 I SettingsState: at com.android.providers.settings.SettingsState.readStateSyncLocked(SettingsState.java:1011) 1970-01-01 00:00:11.176 881 881 I SettingsState: at com.android.providers.settings.SettingsState.<init>(SettingsState.java:292) 1970-01-01 00:00:11.176 881 881 I SettingsState: at com.android.providers.settings.SettingsProvider$SettingsRegistry.ensureSettingsStateLocked(SettingsProvider.java:2794) 1970-01-01 00:00:11.176 881 881 I SettingsState: at com.android.providers.settings.SettingsProvider$SettingsRegistry.migrateLegacySettingsForUserLocked(SettingsProvider.java:3163) 1970-01-01 00:00:11.176 881 881 I SettingsState: at com.android.providers.settings.SettingsProvider$SettingsRegistry.migrateAllLegacySettingsIfNeeded(SettingsProvider.java:3128) 1970-01-01 00:00:11.176 881 881 I SettingsState: at com.android.providers.settings.SettingsProvider$SettingsRegistry.<init>(SettingsProvider.java:2598) 1970-01-01 00:00:11.176 881 881 I SettingsState: at com.android.providers.settings.SettingsProvider.onCreate(SettingsProvider.java:347) 1970-01-01 00:00:11.176 881 881 I SettingsState: at android.content.ContentProvider.attachInfo(ContentProvider.java:2388) 1970-01-01 00:00:11.176 881 881 I SettingsState: at android.content.ContentProvider.attachInfo(ContentProvider.java:2358) 1970-01-01 00:00:11.176 881 881 I SettingsState: at android.app.ActivityThread.installProvider(ActivityThread.java:7245) 1970-01-01 00:00:11.176 881 881 I SettingsState: at android.app.ActivityThread.installContentProviders(ActivityThread.java:6786) 1970-01-01 00:00:11.176 881 881 I SettingsState: at android.app.ActivityThread.installSystemProviders(ActivityThread.java:7438) 1970-01-01 00:00:11.176 881 881 I SettingsState: at com.android.server.am.ActivityManagerService.installSystemProviders(ActivityManagerService.java:7971) 1970-01-01 00:00:11.176 881 881 I SettingsState: at com.android.server.SystemServer.startOtherServices(SystemServer.java:1131) 1970-01-01 00:00:11.176 881 881 I SettingsState: at com.android.server.SystemServer.run(SystemServer.java:607) 1970-01-01 00:00:11.176 881 881 I SettingsState: at com.android.server.SystemServer.main(SystemServer.java:423) 1970-01-01 00:00:11.176 881 881 I SettingsState: at java.lang.reflect.Method.invoke(Native Method) 1970-01-01 00:00:11.176 881 881 I SettingsState: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600) 1970-01-01 00:00:11.176 881 881 I SettingsState: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:925) 1970-01-01 00:00:11.177 881 881 I SettingsState: ancestor directory /data/system/users/0 exists 1970-01-01 00:00:11.177 881 881 I SettingsState: ancestor directory /data/system/users/0 permissions: r: true w: true x: true 1970-01-01 00:00:11.177 881 881 I SettingsState: ancestor's parent directory /data/system/users permissions: r: true w: true x: true 1970-01-01 00:00:11.177 881 881 D SQLiteQueryBuilder: SELECT _id, name, value FROM system with args null 1970-01-01 00:00:11.177 881 881 D SQLiteCursor: received count(*) from native_fill_window: 24 1970-01-01 00:00:11.181 881 881 W SettingsState: No settings state /data/system/users/0/settings_secure.xml 1970-01-01 00:00:11.181 881 881 I SettingsState: directory info for directory/file /data/system/users/0/settings_secure.xml with stacktrace 1970-01-01 00:00:11.181 881 881 I SettingsState: java.lang.Exception 1970-01-01 00:00:11.181 881 881 I SettingsState: at com.android.providers.settings.SettingsState.logSettingsDirectoryInformation(SettingsState.java:892) 1970-01-01 00:00:11.181 881 881 I SettingsState: at com.android.providers.settings.SettingsState.readStateSyncLocked(SettingsState.java:1011) 1970-01-01 00:00:11.181 881 881 I SettingsState: at com.android.providers.settings.SettingsState.<init>(SettingsState.java:292) 1970-01-01 00:00:11.181 881 881 I SettingsState: at com.android.providers.settings.SettingsProvider$SettingsRegistry.ensureSettingsStateLocked(SettingsProvider.java:2794) 1970-01-01 00:00:11.181 881 881 I SettingsState: at com.android.providers.settings.SettingsProvider$SettingsRegistry.migrateLegacySettingsForUserLocked(SettingsProvider.java:3172) 1970-01-01 00:00:11.181 881 881 I SettingsState: at com.android.providers.settings.SettingsProvider$SettingsRegistry.migrateAllLegacySettingsIfNeeded(SettingsProvider.java:3128) 1970-01-01 00:00:11.181 881 881 I SettingsState: at com.android.providers.settings.SettingsProvider$SettingsRegistry.<init>(SettingsProvider.java:2598) 1970-01-01 00:00:11.181 881 881 I SettingsState: at com.android.providers.settings.SettingsProvider.onCreate(SettingsProvider.java:347) 1970-01-01 00:00:11.181 881 881 I SettingsState: at android.content.ContentProvider.attachInfo(ContentProvider.java:2388) 1970-01-01 00:00:11.181 881 881 I SettingsState: at android.content.ContentProvider.attachInfo(ContentProvider.java:2358) 1970-01-01 00:00:11.181 881 881 I SettingsState: at android.app.ActivityThread.installProvider(ActivityThread.java:7245) 1970-01-01 00:00:11.181 881 881 I SettingsState: at android.app.ActivityThread.installContentProviders(ActivityThread.java:6786) 1970-01-01 00:00:11.181 881 881 I SettingsState: at android.app.ActivityThread.installSystemProviders(ActivityThread.java:7438) 1970-01-01 00:00:11.181 881 881 I SettingsState: at com.android.server.am.ActivityManagerService.installSystemProviders(ActivityManagerService.java:7971) 1970-01-01 00:00:11.181 881 881 I SettingsState: at com.android.server.SystemServer.startOtherServices(SystemServer.java:1131) 1970-01-01 00:00:11.181 881 881 I SettingsState: at com.android.server.SystemServer.run(SystemServer.java:607) 1970-01-01 00:00:11.181 881 881 I SettingsState: at com.android.server.SystemServer.main(SystemServer.java:423) 1970-01-01 00:00:11.181 881 881 I SettingsState: at java.lang.reflect.Method.invoke(Native Method) 1970-01-01 00:00:11.181 881 881 I SettingsState: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600) 1970-01-01 00:00:11.181 881 881 I SettingsState: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:925) 1970-01-01 00:00:11.182 881 881 I SettingsState: ancestor directory /data/system/users/0 exists 1970-01-01 00:00:11.182 881 881 I SettingsState: ancestor directory /data/system/users/0 permissions: r: true w: true x: true 1970-01-01 00:00:11.182 881 881 I SettingsState: ancestor's parent directory /data/system/users permissions: r: true w: true x: true 分析错误
06-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值