2

ContentResolverのクエリの選択文字列に SQL WHERE句を定義して、データベースの結果を制限しようとしています。

Cursor cursor = getContentResolver().query(uri, null, getSelectionString(), null, null);

...

public String getSelectionString() {
    // TODO Replace latitude and longitude with database reference.
    StringBuilder string = new StringBuilder();
    string.append("latitude >= ").append(northEast.getLatitudeE6() / 1e6);
    string.append(" AND ");
    string.append("latitude <= ").append(southWest.getLatitudeE6() / 1e6);
    string.append(" AND ");
    string.append("longitude >= ").append(southWest.getLongitudeE6() / 1e6);
    string.append(" AND ");
    string.append("longitude <= ").append(northEast.getLongitudeE6() / 1e6);
    return string.toString();
}

データベースの列は次のように定義されています...

public class CustomDatabase {
    public static final class Contract {
        public static final String COLUMN_NAME = "name";
        public static final String COLUMN_LATITUDE = "latitude";
        public static final String COLUMN_LONGITUDE = "longitude";
    }
}

...

カーソルで送信されたクエリを検査できるかどうかは特にわかりません。その場合、送信した WHERE 句が含まれていません。

SQLiteQuery: SELECT * FROM custom_db ORDER BY number ASC

選択文字列の例を次に示します。

latitude >= 48.203927 AND latitude <= 48.213851 AND longitude >= 16.36735 AND longitude <= 16.377648

質問:

  1. WHERE 句は構文的に正しいですか?
  2. アポストロフィは必要ですか?
  3. クエリで一度に両方のパラメーター (selection、selectionArgs) を使用する必要がありますか?
  4. クエリ全体をどこでデバッグできますか?

編集:

これがContentProviderquery()メソッドです...

public class CustomProvider extends ContentProvider {

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        switch (URI_MATCHER.match(uri)) {
        case URI_CODE_LOCATIONS:
            return mCustomDatabase.getLocations();
        }
        return null;
    }

...明らかに、biegleux が推測したように、パラメーターを渡すのを忘れていました。どっ!
データベースメソッドの現在の実装は次のとおりです...

public class CustomSQLiteOpenHelper extends SQLiteOpenHelper {

    public Cursor getLocation() {
        return mDatabaseHelper.getReadableDatabase().query(
            CustomSQLiteOpenHelper.TABLE_NAME,
            null, null, null, null, null, null);
}

メソッドのシグネチャを次のように変更して、すべてのパラメーターを渡すことをお勧めしますか? この方法では、データベース インターフェイスの多くを公開していませんか?

public Cursor getLocations(String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) {
    return mDatabaseHelper.getReadableDatabase().query(
            CustomSQLiteOpenHelper.TABLE_NAME,
            columns, selection, selectionArgs, groupBy, having, orderBy);
}
4

2 に答える 2

2

わかりましたのでquery()、プロバイダーの方法が問題を引き起こしているようです。次のようになっていることを確認します。

@Override
public abstract Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
...

// run the query
db.query(db, projection, selection, selectionArgs, groupBy, having, sortOrder, limit);

パラメータの使用は強制されませんが、使用selectionArgsするとコードが読みやすくなります。使用できるクエリをデバッグするには

SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
Log.e(TAG, qb.buildQuery(projection, selection, selectionArgs, groupBy, having, sortOrder, limit);

編集:実装されている場合は、ユーザー/ユーザーがメソッドを使用できるため、メソッドContentProviderを公開する必要はありません。少なくともメソッドに渡すことができる引数を渡す必要があり、それらは、、およびです。getLocations()ContentProvider's query()query()projectionselectionselectionArgssortOrder

于 2012-07-14T14:37:25.217 に答える
1

その行は次のようにすべきではありません:

Cursor cursor = getContentResolver().query(uri, null, getSelectionString(), null, null); 

文字列ではなくメソッド呼び出しであることを示すために、後に追加された括弧に注意してください(ただし、私の理論が正しい場合、文字列として存在しない getSelectionStringため、なぜエラーがスローされないのか疑問に思います...)。getSelectionString

于 2012-07-14T13:27:17.723 に答える