SqliteOpenHelper複合クエリーの実装

9054 ワード

データベースはandroidでよく使われるものですが、結局はモバイル側のもので、比較的軽量級の操作であり、削除すべき調査にほかならず、現在も多くのデータベースのフレームワークが使用でき、データベースの操作を簡単に簡略化することができます.最近、プロジェクトでデータベースが使用されているため、プロジェクト自体が小さく、操作を簡素化するためにフレームワークを統合する必要はありません.しかし、確かに少し複雑なデータベースクエリーに遭遇し、自分で時間をかけて次の記録を整理しました.
SqliteOpenHelper
SQLiteは、比較的小さなCライブラリに含まれるACIDを遵守するリレーショナル・データベース管理システムである軽量なデータベースです.D.RichardHippが設立した公有分野プロジェクトです.その設計目標は組み込み型であり、現在多くの組み込み型製品で使用されており、リソースの占有量は非常に低く、組み込み型デバイスでは数百Kのメモリだけで十分である可能性があります.Windows/Linux/Unixなどの主流のオペレーティングシステムをサポートすると同時に、Tcl、C#、PHP、Javaなど多くのプログラム言語と結合することができ、ODBCインタフェースもあり、Mysql、PostgreSQLの2つのオープンソースの世界の有名なデータベース管理システムよりも処理速度が速い.SQLiteの最初のAlphaバージョンは2000年5月に誕生した.2015年までに15年が経ち、SQLiteもSQLite 3のリリースを迎えました
sqlite一般クエリー
SqliteOpenHelper自体はandroidが持っているデータベースを管理するためのクラスであり、データベースの作成と管理、削除、検索を容易にすることができます.通常、クエリー・テーブルではquery()メソッドが使用されます.
上記の図に示すように、query()により、データベースのページング、ソート、クエリーのフィルタリングを簡単に行うことができます.たとえば、次のコードがあります.
public List getMsgListByPositionMode(int positionMode) {
        List list = null;
        rd = helper.getReadableDatabase();
        if (rd.isOpen()) {
            AdMsg msg;
            list = new ArrayList<>();
            Cursor cursor = rd.query(AdvListDBInfo.TABLE_NAME_1, null, AdvListDBInfo.COLUMN_POSITION_MODE + "=?", new String[]{positionMode + ""}, null, null, null);
            while (cursor.moveToNext()) {
                msg = new AdMsg();
                msg.setAdCode(cursor.getString(1));
                msg.setAdShowType((byte) cursor.getInt(2));
                msg.setAdType(cursor.getShort(3));
                msg.setApkVersion(cursor.getString(4));
                msg.setApkVersionInt(cursor.getLong(5));
                msg.setAppPkgnameList(cursor.getString(6));
                msg.setChannelList(cursor.getString(7));
                msg.setClickLimit(cursor.getInt(8));
                msg.setDeliveryApp(cursor.getString(9));
                msg.setDeliveryArea(cursor.getString(10));
                msg.setDeliveryChannel(cursor.getString(11));
                msg.setDisplayContent(cursor.getString(12));
                msg.setDisplayEndDate(cursor.getString(13));
                msg.setDisplayEndTime(cursor.getString(14));
                msg.setDisplayStartDate(cursor.getString(15));
                msg.setDisplayStartTime(cursor.getString(16));
                msg.setDisplayTimeSeparate(cursor.getInt(17));
                msg.setDisplayTitle(cursor.getString(18));
                msg.setImageUrl(cursor.getString(19));
                msg.setLinkUrl(cursor.getString(20));
                msg.setPackageName(cursor.getString(21));
                msg.setPositionMode(cursor.getInt(22));
                msg.setSortWeight(cursor.getInt(23));
                list.add(msg);
            }
            cursor.close();
        }
        return list;
    }

sqlite複合クエリー
しかし、これらの状況は私たちのニーズを満たすことができません.たとえば、Userテーブルがあり、ageがすべて「1」または「2」である場合、これがシナリオ1、またはageが「2」、firstNameが「xiao」である場合、これがシナリオ2であり、queryは私たちのニーズを満たすことが難しい.そこでSqliteOpenHelperはrawQuery()法を提供してこの問題を解決してくれた.
この方法は,sql文を文字列としてクエリに伝達する必要があることを明確に見ることができる.
シナリオ1では、ある条件を満たすデータをクエリーして取り出す必要があります.ここではsqlの「in」キーワードをクエリー判断として使用します.
    SELECT * FROM table WHERE selection IN ('selectionArgs1', 'selectionArgs2', 'selectionArgs3', ...);

実装コードは次のとおりです.
    public List queryByAge(String[] ages) {
        SQLiteDatabase db = helper.getReadableDatabase();
        List list = null;
        User user;
        if (db.isOpen()) {
            list = new ArrayList<>();
            String sql = "select * from " + TABLE + " where age in (";
            for (String age : ages) {
                sql = sql + "\'" + age + "\'" + ", ";
            }
            sql = sql + "\'" + ages[0] + "\'" + ")";
            Cursor cursor = db.rawQuery(sql, null);
            while (cursor.moveToNext()) {
                user = new User();
                user.setAge(cursor.getInt(1));
                user.setFirstName(cursor.getString(2));
                user.setLastName(cursor.getString(3));
                list.add(user);
            }
            cursor.close();
        }

        return list;
    }

シナリオ2では、複数の条件を同時に満たすデータ蔡をクエリーして取り出す必要があります.sqlの「and」キーを使用してクエリーを行います.
    SELECT * FROM table WHERE selection = selectionArgs1 AND selection = selectionArgs2 AND selection = selectionArgs3;

実装コードは次のとおりです.
    public List query(HashMap params) {
        SQLiteDatabase db = helper.getReadableDatabase();
        List list = null;
        if (db.isOpen()) {
            list = new ArrayList<>();
            String sql = "select * from " + TABLE + " where ";
            for (String key : params.keySet()) {
                sql += key + " = " + "\'" + params.get(key) + "\'" + " and ";
            }
            int index = sql.lastIndexOf("and");
            sql = sql.substring(0, index);
            User user;
            Cursor cursor = db.rawQuery(sql, null);
            while (cursor.moveToNext()) {
                user = new User();
                user.setAge(cursor.getInt(1));
                user.setFirstName(cursor.getString(2));
                user.setLastName(cursor.getString(3));
                list.add(user);
            }
            cursor.close();
        }
        return list;
    }

以上のコードのdemoは私のgithubを参照してください.