3

RSS アプリを開いたときに、データベースに記事が存在するかどうかを確認したいのですが、存在する場合は削除 (または無視) し、データベースに書き込まない場合は無視します。

私はそれを次のようにしようとしています:

            Cursor cursor = ourDatabase.rawQuery("select 1 from "
                    + DBHelper.DATABASE_TABLE + " where " + DBHelper.TITLE + "='"
                    + title + "'" + " AND " + DBHelper.DATE + "='" + date + "'",
                    new String[] {});
            if (cursor.moveToFirst()) {
                boolean exists = (cursor.getCount() > 0);
                cursor.close();
                return exists;
            } else {
    return false;       }

        }

しかし、私はこのエラーが発生します:

06-06 16:01:11.341: E/AndroidRuntime(13867): Caused by: android.database.sqlite.SQLiteException: near "όσο": syntax error (code 1): , while compiling: select 1 from all_t where title='Ο ΦΟΒΟΣ και ο ΤΡΟΜΟΣ των διαδηλωτών!!! Αυτές οι γυναίκες είναι πιο σκληρές απ' όσο δείχνουν!' AND date='Wed, 05 Jun 2013 18:12:15'
4

4 に答える 4

10

これは を使用しない場合の典型的な問題でありselectionArgs、まさにそれが使用すべき理由です: 文字列を単純な引用符で引用していますが、文字列には一重引用符が含まれているため、SQLite は実際に終了する前に文字列の末尾を検出します。残りを SQLite キーワードとして解析してみてください。

適切な解決策は、エスケープを SQLite に任せ、selectionArgs自分でエスケープしようとするのではなく、SQLite を使用することです。あなたの場合、それは次のようになります:

Cursor cursor = ourDatabase.rawQuery("select 1 from "
            + DBHelper.DATABASE_TABLE + " where " + DBHelper.TITLE + "=?"
            + " AND " + DBHelper.DATE + "=?",
            new String[] {title, date});

さらに、毎回クエリを構築するのではなく、クエリから定数を作成できるため、よりクリーンです。

于 2013-06-06T13:19:41.650 に答える
6

他に選択肢がない限り、生のクエリを使用しないでください。

Cursor findEntry = db.query(TABLE, columns, DBHelper.TITLE + "=?", new String[] { title }, null, null, null);

または複数のもの

Cursor findEntry = db.query((TABLE, columns, DBHelper.TITLE + "=? and " + DBHelper.DATE + "=?", new String[] { title, date}, null, null, null);
于 2013-06-06T13:14:40.493 に答える
1

これまでの回答は正しいですが、パラメーター化されたクエリを使用する方がはるかに優れています。余分な作業は必要ありません。実際、一重引用符をエスケープするという彼らの提案の方が簡単です。

于 2013-06-06T13:11:37.660 に答える