2

私は列車のスケジュールのために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ビューの各行に表示する情報です。

4

1 に答える 1

0
SELECT FromSch.trainID,
       FromSt.name,
       FromSchSt.departure,
       ToSt.name,
       ToSchSt.arrival
FROM    stations          FromSt
   JOIN schedule_stations FromSchSt ON FromSt._id = FromSchSt.stationID
   JOIN schedule          FromSch   ON FromSchSt._id = FromSch.scheduleStationId
   JOIN schedule          ToSch     ON FromSch.trainID = ToSch.trainID
                                   AND FromSch.day = ToSch.day
   JOIN schedule_stations ToSchSt   ON ToSch.scheduleStationId = ToSchSt._id
   JOIN stations          ToSt      ON ToSchSt.stationID = ToSt._id
WHERE  FromSt._id = ?
   AND ToSt._id = ?
-- AND FromSch.day = ?
于 2012-11-06T19:05:32.497 に答える