SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

nếu bảng của tôi có 4 cột và tôi muốn lấy cột thứ 3 thì tôi phải làm gì.

Khía cạnh quan trọng không phải là bảng hoặc các bảng mà là chính truy vấn xác định thứ tự cột.

Ví dụ:nếu truy vấn dựa trên SELECT * FROM your_table (và các cột trong bảng được định nghĩa là id, songname, songyear, songpath) thì cột là con trỏ sẽ giống như định nghĩa.

Tuy nhiên, nếu bạn đã SELECT songname, songpath, songid, songyear FROM your_table;

Thứ tự sẽ theo CHỌN câu lệnh tức là tên bài hát (0), đường dẫn bài hát (1), bài hát (2), bài hát năm (3).

Tuy nhiên, đó là một trong những vấn đề với việc sử dụng hiệu số mà bạn bị ràng buộc với thứ tự theo CHỌN.

Bây giờ nếu bạn đã sử dụng getColumnIndex của Con trỏ thì phương thức đó trả về độ lệch cột theo tên của nó.

Vì vậy, cursor.getString(cursor.getColumnIndex("songpath")); sẽ nhận được cột songpath bất kể độ lệch / vị trí của nó trong Con trỏ (NẾU CURSOR BAO GỒM MÀ CỘT).

Nhớ lại câu hỏi trước của bạn, về cơ bản, bạn đã có SELECT songpath FROM your_table Vì vậy, chỉ có một cột duy nhất trong Con trỏ kết quả nên bạn chỉ có thể sử dụng get:-

cursor.getString(0); 

hoặc:-

cursor.getString(cursor.getColumnIndex("songpath"));

Phương pháp sau là phương pháp được khuyến nghị (NHƯNG lý tưởng là có tên cột được xác định là hằng số)

Mặc dù vậy, các vấn đề có thể trở nên phức tạp hơn, chẳng hạn như hãy xem xét

SELECT songpath||songname AS myconfusingcolumn FROM yourtable;

Điều này sẽ trả về một cột duy nhất có tên là myconfusingcolumn bao gồm đường dẫn bài hát được nối với tên bài hát. Đó là từ khóa AS được theo sau bởi một bí danh cho cột (nếu không có AS, tên cột sẽ càng khó hiểu / khó hơn khi nó sẽ là songpath || songname) (ví dụ này tương đối đơn giản).

Một điều khác cần cảnh giác là không rõ ràng cột (tên cột trùng lặp) ví dụ:nếu bạn có hai bảng bài hát và nghệ sĩ và bài hát có cột bổ sung artist_id để bạn có:-

Bài hát bảng có các cột id , tên bài hát , songyear , songpath , artist_id

Các nghệ sĩ bảng có các cột id artist_name

và sau đó bạn đã sử dụng

SELECT * FROM song JOIN artist ON song.artist_id = artist.id;
  • Lưu ý rằng dưới dạng id cột của nghệ sĩ bảng, nếu được sử dụng trong câu lệnh, nó phải được đặt trước bằng tên bảng tương ứng nếu không sẽ xảy ra lỗi cột AMBIGUOUS, tức là trình phân tích cú pháp SQL sẽ không biết id nào ý bạn là gì.

Hơn nữa, bạn sẽ kết thúc với một Con trỏ có các cột:-

id , tên bài hát, năm bài hát, đường dẫn bài hát, artist_id, id , artist_name

csr.getLong(csr.getColumnIndex("id")); could get confused (I believe it actually gets the last AMBIGUOUS column)

long songid = csr.getLong(0); would get the id column from the song table.
long artistid = csr.getLong(5); would get the id column from the artist table.
long artistid = csr.getLong(4); would also get the artist_id same as (5).

Tóm tắt / tóm tắt:-

Các cột, thứ tự và tên, trong Con trỏ hoàn toàn phụ thuộc vào truy vấn SELECT. Chúng sẽ có một phần bù và tên theo truy vấn. Khi truy cập Con trỏ, (các) tên bảng bên dưới không thể sử dụng được chỉ là tên cột hoặc phần bù.

Sẽ linh hoạt hơn khi truy cập các cột theo tên của chúng thay vì theo tên của chúng . Đó là sử dụng getColumnIndex của Con trỏ vì nó phủ nhận sự cần thiết phải tính toán hiệu số và đặc biệt hơn là việc tính toán lại bị thiếu nên một truy vấn được thay đổi.

Sử dụng CONSTANTS cho tên cột có thể sẽ giảm thiểu các vấn đề như lỗi nhập.

Bổ sung

Sử dụng Toast.makeText(this, mListSongs+"", Toast.LENGTH_SHORT).show();

Sẽ nhận được kết quả bất thường [{}] vì mListSongs là toàn bộ vùng chứa Bài hát. Bạn cần lặp lại từng phần tử và sau đó lấy các thuộc tính / giá trị cho từng thành viên / biến từ phần tử (đối tượng Song).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sao chép sqlite trong nội dung studio android không hoạt động

  2. dữ liệu được tải từ cơ sở dữ liệu SQLitE không được lưu trong lớp mô hình ArrayList android

  3. Gây ra bởi:android.database.sqlite.SQLiteException:không có bảng như vậy:(mã 1) Android

  4. Lấy Ngày / Giờ từ Dấu thời gian Unix trong SQLite

  5. Sử dụng Firebase DB với DB cục bộ