Cursor#queryの結果の一部を削除できますか?

286 views
Skip to first unread message

Sugawara

unread,
Mar 22, 2012, 2:54:16 AM3/22/12
to android-g...@googlegroups.com
はじめまして、Sugawaraと申します。

SimpleCursorAdapterにデータベースのCursorを渡す前に、
Cursor#queryの結果の一部を削除したいのですが可能でしょうか?

Cursor#moveToNext()で順次カーソルを回して特定条件下で削除しようと思ったのですが、
ドキュメントを読んでもremove()メソッドのようなものはないようで……。

やりたいことは、
データベース指定カラムの中で、「Stringの最初の一行に特定単語があるかのマッチ」をさせたかったのですが、
SQL文で行頭(文頭)マッチのやり方がわからず、
ならカーソル直接削除しよう、と思い立ったところで、壁にぶちあたってしまった次第です。。

SQLで正規表現(^)が使えれば一発なんですが……何か代替方法、小さなヒントでも教えて頂けると助かります!

---------------------------------------------------------------------------------------
String word = "sample";
String where = "hoge like '^%" + sample + "%'"; //←こんなような文頭マッチをしたいです
Cursor cursor = db.query("hoge", "hogeDB", where, null, null, null);

if(cursor.moveToFirst()){
  do{
        String str = cursor.getString(0).replaceAll("^.*(" + word + ").*$", "$1");
        if(str.equals(word)){
                 // cursor.remove() ができれば言うことないです…
        }
     }while(cursor.moveToNext());
}
// 以下 SimpleCursorAdapter に cursor セット
--------------------------------------------------------------------------------------- 

StackOverflowなど海外の掲示板も見たんですが、
Like演算子でがんばれってのが多く……
(自分がわかってないだけで)SQLのSelect文って正規表現ばりの検索が簡単にできるんでしょうか?(^^;

mokkouyou

unread,
Mar 22, 2012, 3:50:32 AM3/22/12
to android-g...@googlegroups.com
mokkouyouです。

条件反射で思いつきですが、

(word%の様にワイルドカードを後ろに置くだけじゃダメという前提になりますが)
条件に合致するものをMatrixCurosor等に詰め替えて返すという手もあるかと思います。
もちろん色々なトレードオフはあるかと思いますが。

Sugawara

unread,
Mar 22, 2012, 1:15:28 PM3/22/12
to android-g...@googlegroups.com
返信ありがとうございます。
MatrixCursor、初耳でした。手動で詰め替えるイメージですね。
ちょっと試行錯誤してみて結果報告します!

追伸:
最初の投稿、引数間違えだらけでした、すいません。。

2012年3月22日木曜日16時50分32秒 UTC+9 mokkouyou:

Sugawara

unread,
Apr 5, 2012, 1:07:30 PM4/5/12
to android-g...@googlegroups.com
報告送れてすみません。
MatrixCursor使用して無事にうまくいきました。
ありがとうございます!

/////////////////////////////////////////////////

String[] cols = {"sample", "sample2"};
SQLiteDatabase db;

/////////////// Set cursor /////////////////

Cursor cursor = db.query("hogeDB", cols, null, null, null, null, null);
MatrixCursor mcursor = new MatrixCursor(cols);
if(cursor.moveToFirst()){
    String word = "test";
    String regex = "^.*" + word + ".*\n";
    Pattern pattern = Pattern.compile(regex);
    do{
// マッチした Cursor だけ MatrixCursor に格納する
Matcher matcher = pattern.matcher(cursor.getString(0));
        if(matcher.find()){
            mcursor.addRow(new String[]{
            cursor.getString(0),
            cursor.getString(1),
        }
    }while(cursor.moveToNext());
}

////// 以下 SimpleCursorAdapter に mcursor セット ///////


Reply all
Reply to author
Forward
0 new messages