SQLクエリを受け取って実行するdb SELECTステートメントをラップするメソッドを書いています。結果は に収集されObject[][]
ます。データベース内のすべてのセルは整数または文字列です。
戻り配列に問題があります。ですObject[][]
のでゆるいタイプです。
public Object[][] select(String query) {
Object[][] result = new Object[cursor.getCount()][cursor.getColumnCount()];
Cursor cursor = db.rawQuery(query, null);
//Iterate over cursor (rows)
do {
//Iterate over columns (cells with data of different type)
for(int columnIndex = 0; columnIndex < cursor.getColumnCount(); columnIndex++) {
int type = cursor.getType(columnIndex);
//assume, that there are only two types - String or Integer (actualy there are 3 more types)
if(type == Cursor.FIELD_TYPE_INTEGER) {
result[cursor.getPosition()][columnIndex] = cursor.getInt(columnIndex);
}
else if(type == Cursor.FIELD_TYPE_STRING) {
result[cursor.getPosition()][columnIndex] = cursor.getString(columnIndex);
}
}
} while (cursor.moveToNext());
return result;
}
ゆるくしたくないタイプ。たとえば、次のようにできるようにしたい (疑似コード):
//pseudocode:
result = select("SELECT age, name FROM people")
print( "Hello, " + result[0][0] + ". In ten years you'll be " )
print( result[0][0] + 10 )
//Prints: Hello, John. In ten years you'll be 56
Java に関するすべての本には、さまざまな型の配列を持つことはできないと書かれています。それは明確だ。
しかし、DB からこのすべての整数と文字列を保持するにはどうすればよいでしょうか? コレクションとジェネリックを使用しようとしましたが、うまくいきませんでした - Java は初めてです。
また、ある種の Result 値ホルダーを使用しようとしました:
private class Result {
private Class type;
private Object value;
...
public ??? get() { //??? - int or string - here I have some problems :)
return this.type.cast(this.value);
}
//do NOT want to have these:
public int getInt() { return (int) value; }
public int getString() { return (String) value; }
}
この場合、メソッドselect(...)
は戻ります。Result[][]
自問自答: PHP で行ったように、Java でコーディングしようとしていたことを理解しました。強い型付けでは、明示的なキャストなしですべての型を返す、単純な方法を作成できません。
結局、共通のデータ オブジェクトを作成し、選択時にそれらを埋めることにしました。