2013-07-24 24 views
9

Hiện tại, tôi có một bảng các bài đăng và một bảng người dùng. Đương nhiên, mỗi người dùng có thể được liên kết với nhiều bài đăng. Mỗi hàng trong bảng bài sẽ lưu trữ ID người dùng của người dùng đã tạo bài đăng. Dưới đây là ví dụ hàng:Làm cách nào để kết hợp dữ liệu từ hai bảng riêng biệt vào một Con trỏ đơn?

bài viết liên tiếp: tít post_id user_id

tài hàng: user_id user_name

Tôi muốn trả về một con trỏ chứa cả hàng bưu chính, hàng sử dụng tương ứng của nó bằng cách kết hợp các ID người dùng trong bảng đăng lên ID người dùng trong bảng người dùng. Tôi sẽ sử dụng loại truy vấn nào để đạt được điều này? Kết quả sẽ là:

kết hợp hàng: post_id tít user_id user_name

Tổng quát hơn: Làm thế nào để kết hợp dữ liệu từ hai bảng riêng biệt dựa trên một mảnh chia sẻ dữ liệu vào một con trỏ duy nhất?

Trả lời

8

Bạn cũng có thể sử dụng câu lệnh SQLite liệu trong mã Android của bạn như ví dụ:

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(); 

Trong SELECT định dạng là table_name.column_name. BẬT là nơi bạn sẽ kết hợp dữ liệu dựa trên một phần dữ liệu được chia sẻ.

+0

Tôi có thể tham gia cùng họ mà không chỉ định current_id không? Tôi muốn kết hợp tất cả các hàng trong bảng bài với bảng người dùng, không chỉ một ID. – cheese1756

+1

Yea bạn không cần mệnh đề WHERE, tôi chỉ sao chép điều này từ một số mã của tôi cho một ví dụ. – TronicZomB

+0

Truy vấn hoạt động rất tốt, nhưng dường như các mục nhập trùng lặp cho một số hàng. Bạn có biết cách sửa lỗi này không? Đây là truy vấn của tôi: 'SELECT post._id, post.headline, post.url, post.user_id, post.expiration, post.timestamp, user._id, user.name, user.about, user.email, user. phone FROM post THAM GIA người dùng ON post.user_id = user._id' Cảm ơn sự giúp đỡ của bạn! – cheese1756

10

Bạn có thể sử dụng một CursorJoiner để có được một cái gì đó tương tự như sáp nhập hai con trỏ vào một. CursorJoiner không thực sự hợp nhất. Khi bạn lặp lại nó, nó di chuyển hai con trỏ ban đầu sao cho các hàng của chúng sẽ khớp với các cột được chỉ định. Đây là lý do tại sao cần phải sắp xếp cả hai con trỏ trên các cột sẽ được sử dụng trong phép nối.

Liên kết đến tài liệu: http://developer.android.com/reference/android/database/CursorJoiner.html

Mã dụ:

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

Một người dùng tương ứng với nhiều bài đăng, mặc dù vậy, việc sắp xếp trên ID vẫn có thể chấp nhận được hay mọi thứ sẽ bị hỏng? – cheese1756

+1

Có, điều này là tốt. Tôi đã cập nhật câu trả lời của mình bằng một ví dụ. Nếu bạn có quyền truy cập trực tiếp vào cả hai bảng cơ sở dữ liệu trong ứng dụng của mình, có lẽ bạn nên sử dụng câu trả lời của TronicZomB. CursorJoiner tốt nhất cho các trường hợp bạn chỉ có quyền truy cập vào các con trỏ chứ không phải các nguồn dữ liệu cơ bản của chúng (ví dụ: Các con trỏ thu được từ trình ContentProvider của các ứng dụng khác nhau) – ErikR

+0

Cảm ơn bạn về ví dụ. Tôi có quyền truy cập trực tiếp vào cơ sở dữ liệu vì vậy tôi đã sử dụng câu trả lời của TronicZomB, nhưng của bạn là tuyệt vời để tham khảo trong tương lai (hoặc cho người khác có vấn đề tương tự). – cheese1756

Các vấn đề liên quan