如何在ContentProvider中使用COUNT()函数

最近在项目中需要使用COUNT()函数搜索相同的项,使用SQL语句是这样的

SELECT id, COUNT(*) as count
FROM table
WHERE item != ''
GROUP BY item
ORDER BY count DESC


可以直接调用数据库的方式,

public int getCount(String param1, String param2){
        SQLiteDatabase db = this.getReadableDatabase();
        long count;
        count = DatabaseUtils.queryNumEntries(db, "TABLE_NAME",
                "param1=? AND param2=?", new String[]{param1, param2});

        db.close();
        return count;
    }

但是这样就不如使用contentprovider封装的方式,还需要考虑db.close。

换做contentprovider方式如何实现呢?

参考:http://stackoverflow.com/questions/16408007/count-on-custom-contentprovider

Table

public static class Promotion implements BaseColumns {

    private Promotion() {

    }

    public static final String TABLE_NAME = "promotions";
    public static final String PATH_PROMOTIONS = "/promotions";
    public static final String PATH_PROMOTION_ID = "/promotion/#";
    public static final Uri CONTENT_URI = Uri.parse(SCHEME + AUTHORITY + PATH_PROMOTIONS);
    public static final Uri CONTENT_URI_ID = Uri.parse(SCHEME + AUTHORITY + PATH_PROMOTION_ID);
    public static final String COLUMN_NAME_ADVERTISER = "advertiser";
    public static final String COLUMN_NAME_SUBJECT = "subject";
    public static final String COLUMN_NAME_URL = "promo_url";
    public static final String COLUMN_NAME_CATEGORY = "category";
    public static final String COLUMN_NAME_READED = "is_readed";
    public static final String COLUMN_NAME_STARRED = "is_starred";
    public static final String COLUMN_NAME_UNTIL = "until";
    public static final String COLUMN_NAME_CREATE_DATE = "created";
    public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.package.promotion";
    public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.package.promotion";
}
SELECT 
  COLUMN_NAME_ADVERTISER,
  COUNT(COLUMN_NAME_ADVERTISER) AS _COUNT
FROM
  TABLE_NAME
WHERE
  (COLUMN_NAME_READED = ?)
GROUP BY
  COLUMN_NAME_ADVERTISER;

Fragment
public class InboxListFragment extends ListFragment {

    private SimpleCursorAdapter mAdapter;

    @Override
    public View onCreateView(
            LayoutInflater inflater,
            ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_list, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        fillData();
    }

    private void fillData() {

        final String[] from = { MyPackage.Promotion.COLUMN_NAME_ADVERTISER,
                MyPackage.Promotion._COUNT };
        final int[] to = new int[] { android.R.id.text1 };

        mAdapter = new SimpleCursorAdapter(getActivity().getApplicationContext(),
                android.R.layout.simple_list_item_1, null, from, to, 0);
        setListAdapter(mAdapter);

        getLoaderManager().initLoader(0, null, new myLoader());
    }

    public class myLoader implements LoaderCallbacks<Cursor> {

        @Override
        public Loader<Cursor> onCreateLoader(int id, Bundle args) {

            final String count = String.format("COUNT(%s) as %s",
                    MyPackage.Promotion.COLUMN_NAME_ADVERTISER, MyPackage.Promotion._COUNT);

            final String[] projection = { MyPackage.Promotion.COLUMN_NAME_ADVERTISER,
                    count };

            final String selection = MyPackage.Promotion.COLUMN_NAME_READED + " = ?";
            final String[] selectionArgs = { "0" };

            final CursorLoader loader = new CursorLoader(getActivity(),
                    MyPackage.Promotion.CONTENT_URI, projection, selection, selectionArgs,
                    null);

            return loader;
        }

        @Override
        public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
            mAdapter.swapCursor(cursor);
        }

        @Override
        public void onLoaderReset(Loader<Cursor> loader) {
            mAdapter.swapCursor(null);
        }

    }

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值