2013-07-24 26 views
9

現在、私はポストのテーブルとユーザーのテーブルを持っています。もちろん、各ユーザーは複数の投稿に関連付けることができます。投稿テーブルの各行には、投稿を作成したユーザーのユーザーIDが格納されます。ここでは例として行されています2つのテーブルのデータを1つのカーソルに結合するにはどうすればよいですか?

ポスト行は:私は、ユーザーのIDを照合することによって、ポスト行とそれに対応するユーザー列の両方を含むカーソルを返すようにしたいのuser_idのuser_name

:post_idの見出しは

ユーザーの行をUSER_IDポストテーブルをユーザテーブル内のユーザIDに割り当てる。これを達成するために使用するクエリのタイプは何ですか?結果は次のようになります。

コンバインド行:post_idの見出しUSER_ID user_nameの

より一般的には:どのように私は、単一のカーソルへのデータの共有部分に基づいて2つの別々のテーブルからデータを結合しますか?

答えて

8

また、このようなようなあなたのAndroidのコードで生SQLiteのステートメントを使用することができます。SELECTで

SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery("SELECT serials.id, serials.cabinet_number, serials.serial_number, " + 
      "configuration.frequency, configuration.ag, configuration.number_alarms, configuration.failed_rapper, configuration.max_mv, configuration.max_nav " + 
      "FROM serials JOIN configuration ON serials.id = configuration.serial_id WHERE serials.id = '" + current_id + "'", null); 
    cursor.moveToFirst(); 

形式がありますtable_name.column_name。 ONは、共有データに基づいてデータを結合する場所です。

+0

current_idを指定せずに参加することはできますか?私はポストテーブルのすべての行を1つのIDだけでなく、userテーブルと組み合わせたいと思っています。 – cheese1756

+1

あなたはWHERE句を必要としません。私は例のために私のコードのいくつかからこれをコピーしました。 – TronicZomB

+0

クエリはうまく機能しますが、一部の行のエントリが重複しているようです。あなたはこれを修正する方法を知っていますか?私の質問は次のとおりです。 'SELECT post._id、post.headline、post.url、post.user_id、post.expiration、post.timestamp、user._id、user.name、user.about、user.email、user。電話からFROM POST JOINユーザーON post.user_id = user._id' ありがとうございました! – cheese1756

10

CursorJoinerを使用すると、2つのカーソルを1つにマージするのと同じことができます。 CursorJoinerは実際にマージを実行しません。これを繰り返し実行すると、元の2つのカーソルが移動し、指定された列で行が一致します。このため、両方のカーソルを結合で使用する列でソートする必要があります。ドキュメントへ

リンク:http://developer.android.com/reference/android/database/CursorJoiner.html

コード例:

CursorJoiner joiner = new CursorJoiner(userCursor, new String[]{ "user_id" }, postCursor, new String[] {"user_id"}); 

while (joiner.hasNext()) { 
    CursorJoiner.Result result = joiner.next(); 
     switch (result) { 
      case LEFT: 
       // don't care about this case 
       break; 

      case RIGHT: 
       // nor this case 
       break; 

      case BOTH: 
       // here both original Cursors are pointing at rows that have the same user_id, so we can extract values 
       int postId = postCursor.getInt(...); 
       String headline = postCursor.getString(...); 
       int userId = userCursor.getInt(...);   
       String userName = userCursor.getString(...); 

       // do something with above values 

       break; 

     } 
}  
+0

1人のユーザーが複数の投稿に対応しているため、IDの並べ替えは依然として受け入れられますか、物事が乱れることはありますか? – cheese1756

+1

はい、これは問題ありません。私は答えを例で更新しました。あなたのアプリケーションの両方のデータベーステーブルに直接アクセスできるなら、おそらくTronicZomBの答えを使う方が良いでしょう。 CursorJoinerは、カーソルにのみアクセスでき、基礎となるデータソースではない場合に最適です(例:さまざまなアプリケーションのContentProvidersから取得したカーソル) – ErikR

+0

ありがとうございます。私はTronicZomBの答えを使用したので、データベースへの直接アクセスがありますが、あなたのものは将来の参照(または同様の問題を抱えている他の人のために)には最適です。 – cheese1756

関連する問題