Android database ,按频率查询

来源:互联网 发布:安卓手机mac地址怎么查 编辑:程序博客网 时间:2024/05/16 06:14

最近一个关于foods应用中,用户需求中包含“Recent”foods列表,和“highfrequent”foods list。

1.对于recent foods list,可以简单的将每次添加的food 插入到数据库的表中。然后做简单的查询就可以。这里面可以有重复记录,不会对重复foods进行删除。这有一个好处是,用户可以看到自己添加的foods的历史记录(recent)列表,android中用ContentResolver结构就可以实现。

2.对于frequent foods list,在列表中不能出现重复数据,而且要求频率高的数据排在前面。

这时直接用ContentResolver进行查询很难实现,需要更改数据库的provider程序。

下面就是实现按照频率查询的方法。


1.查询结果所要的结构。public static String sProjection [] = new String[]{COL_DESCRIPTION,COL_TOTAL_CALORIES,COL_SERVING_SIZE,COL_SERVING_UNIT,COL_TOTAL_FAT,COL_SATURATED,COL_POLYUNSATURATED,COL_MON_SATURATED,COL_CHOLESTEROL,COL_SODIUM,COL_POTASSIUM,COL_TOTAL_CARBS,COL_DIETARY_FIBER,COL_SUGARS,COL_PROTEIN,COL_VITAMIN_A,COL_VITAMIN_C,COL_CALCIUM,COL_IRON};2.Provider中的实现public final static String FREQUENT_QUERY = "FREQUENT";public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {SQLiteQueryBuilder qb = new SQLiteQueryBuilder();SQLiteDatabase db = dbHelper.getReadableDatabase();qb.setTables(RecentFoodDBData.TABLE_NAME);             //使用selection作为复用字段。如果是查询频率,使用数据库的rawQuery方法查询,然后结果按照数量排序。if (selection !=null && selection.trim().equals(FREQUENT_QUERY)){//order by frequent.String columns = "";for (String s : projection){columns += s + ",";}String sql = "SELECT "+ columns +" COUNT(*) AS count FROM "+ RecentFoodDBData.TABLE_NAME + " GROUP BY 1 ORDER BY count DESC";Cursor c = db.rawQuery(sql, null);c.setNotificationUri(getContext().getContentResolver(), uri);return c;}else{Cursor c = qb.query(db, projection, selection, null, null, null, sortOrder);c.setNotificationUri(getContext().getContentResolver(), uri);return c;}}3.在程序中使用Cursor cursor = resolver.query(RecentFoodDBData.CONTENT_URI, RecentFoodDBData.sProjection, RecentFoodDBContentProvider.FREQUENT_QUERY, null, null);


0 0