私は列車のスケジュールのためにsqliteを使ってAndroidアプリケーションを構築しています。私のアプリケーションは、ユーザー2の駅から、日付と日付を要求します(今のところ日付は無視しています)。それらを使って、特定の日にそれらのステーション間で利用可能なすべてのスケジュールを返すために、単一のクエリを実行しようとしてきました。
私のテーブル構造は次のとおりです。
stations (_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
central BOOLEAN)
schedule_stations (_id INTEGER PRIMARY KEY AUTOINCREMENT,
arrival TEXT,
departure TEXT,
availability INTEGER,
stationID INTEGER,
FOREIGN KEY(stationID) REFERENCES stations(_id))
schedule (_id INTEGER PRIMARY KEY AUTOINCREMENT,
trainID INTEGER,
day TEXT,
scheduleStationId INTEGER,
FOREIGN KEY(scheduleStationId) REFERENCES schedule_stations(_id))
これまでのところ、指定されたFromステーションを使用して2つのクエリを考案することができました。
c1=db.rawQuery(
"SELECT s2._id, name, departure, trainID " +
"FROM schedule_stations s1 INNER JOIN stations s2 " +
"ON s1.stationID = s2._id INNER JOIN schedule s3 " +
"ON s3.scheduleStationId = s1._id " +
"WHERE stationID=? ",
new String[] {station1+""});
これにより、提供されたFromステーション(station1)からのすべての出発が得られます。
そして、私が持っているToステーションを使用します。
c2=db.rawQuery(
"SELECT s2._id, name, arrival, trainID " +
"FROM schedule_stations s1 INNER JOIN stations s2 " +
"ON s1.stationID = s2._id INNER JOIN schedule s3 " +
"ON s3.scheduleStationId = s1._id " +
"WHERE stationID=? AND trainID IN ("+queryPlaceholders(strlist.size()-1)+")",
strlist.toArray(new String[0]));
これにより、(接続を保証するために)最初のクエリで表示されたtrainIDを持つ提供されたToステーションへのすべての到着がわかります。
カーソルを個別に出力すると、正しいように見えます(最後の3つの要素は、ステーション名|時間|トレインIDであることに注意してください)。
C1: Row: 0, Values: 1; Station A; 08:00; 1
C1: Row: 1, Values: 1; Station A; 12:00; 2
C2: Row: 0, Values: 2; Station B; 09:00; 1
C2: Row: 1, Values: 2; Station B; 13:00; 2
私が望むのは、どういうわけかこれらを1つのクエリにマージして、リストアダプターとビューにデータを入力するために使用できるカーソルが1つだけになるようにすることです。MergeCursorは列を追加しただけで、trainIDによって列をリンクしないため、役に立ちませんでした。クエリ間でINNERJOINとUNIONを使用しようとしましたが、構文エラーが発生しました。
上記の出力を想定すると、1つのクエリに期待するのは、2行のカーソルで、各行には2つのネームステーションと2つの日付(到着/出発)があります。これは、Androidビューの各行に表示する情報です。