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
質問:
- WHERE 句は構文的に正しいですか?
- アポストロフィは必要ですか?
- クエリで一度に両方のパラメーター (selection、selectionArgs) を使用する必要がありますか?
- クエリ全体をどこでデバッグできますか?
編集:
これがContentProviderのquery()メソッドです...
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);
}