2010-07-07 39 views
62

Trường "_id" có cần thiết trong Android SQLite không?Giới thiệu về trường "_id" trong Android SQLite

+0

cho bất kỳ ai khác nhấn trang kiểm tra https://www.sqlite.org/autoinc.html điều này thực sự hữu ích. Cụ thể đọc điều 'ROWID'. –

+0

Câu trả lời đúng sẽ là 'KHÔNG'. Vì cơ sở dữ liệu SQlite Engine đã có một cơ chế tạo ra một 'ROWID' duy nhất cho mỗi hàng mới mà bạn chèn vào. Và nếu bảng của bạn có một 'PRIMARY_KEY' thì nó sẽ trở thành bí danh cho' ROW_ID' đó. –

Trả lời

52

_id rất hữu ích khi bạn đang sử dụng Bộ điều hợp nâng cao sử dụng Con trỏ (ví dụ: ResourceCursorAdapter). Nó được sử dụng bởi các bộ điều hợp này để cung cấp ID có thể được sử dụng để tham chiếu đến hàng cụ thể trong bảng có liên quan đến mục trong bất kỳ bộ điều hợp nào đang được sử dụng cho (ví dụ: một hàng trong một ListView). Không cần thiết nếu bạn không sử dụng các lớp cần cột _id trong con trỏ và bạn cũng có thể sử dụng "as _id" để làm cho cột khác xuất hiện như thể nó được gọi là _id trong con trỏ của bạn.

+0

Cảm ơn bạn, chính xác những gì tôi đang cố gắng tìm hiểu. –

8

Khá thuận tiện trong nhiều trường hợp để có trường id. Tôi thích tôi được tự động gia tăng (như hình dưới đây). Tôi luôn tìm cách sử dụng mới cho trường id :)

Khi đến lúc đính kèm dữ liệu vào bộ điều hợp, tôi thích sử dụng bí danh tên bảng để truy vấn trường id là _id. Ví dụ: SELECT id _id, msg from message order by id. Bằng cách đó các bộ chuyển đổi nhìn thấy một lĩnh vực được gọi là _id và tất cả mọi người hạnh phúc.

Dưới đây là một ví dụ về cách tôi xác định các bảng của tôi:

CREATE TABLE message (_id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp INTEGER, tripID TEXT, msg TEXT); 
+1

phải là "_id"? – Dori

+1

'..., dấu thời gian TIMESTAMP, ...' cũng có thể. – SK9

+3

lưu ý rằng 'AUTOINCREMENT' là không cần thiết trừ khi bạn muốn đảm bảo rằng trong suốt thời gian tồn tại của cơ sở dữ liệu, cùng một id sẽ không được sử dụng lại. http://www.sqlite.org/autoinc.html – forcewill

21

Tại sao không tận dụng _ROWID_?

SQLite cung cấp điều này cho mọi hàng, vì vậy bạn chỉ có thể đặt bí danh nó thành _id trong câu lệnh chọn của bạn.

+1

Mẹo hay. Nếu bạn tạo một bảng với _id (được ánh xạ tới ROWID), nó sẽ thẳng tiến hơn. –

+2

@greenrobot, cú pháp cho điều đó là gì? – Dori

+3

@Dori Kiểm tra http://www.sqlite.org/lang_createtable.html#rowid –

10

Về mặt kỹ thuật không có lĩnh vực _id là không bắt buộc, tuy nhiên nếu bạn đang làm cho việc sử dụng lớp CursorAdapter (mà có thể bạn đang có, đặc biệt là nếu bạn đang làm việc với ví dụ Notepad) sau đó có

"Các con trỏ phải bao gồm cột có tên "_id" hoặc lớp này sẽ không hoạt động "

như được giải thích trong tài liệu here. Thật không may các ví dụ mã không làm cho điều này rất rõ ràng.

0

Tất nhiên nếu bạn đang tạo tiện ích con của riêng mình và bộ điều hợp riêng, bạn không phải đặt tên khóa chính là "_id". Nó có thể là bất kỳ tên nào bạn muốn. Nhưng bạn sẽ chịu trách nhiệm quản lý bộ sưu tập các tiện ích giao diện người dùng và gắn chúng vào hàng bên phải trong cơ sở dữ liệu của bạn. "_id" chỉ hữu ích cho ListView như Brad đã chỉ ra.

5

Từ official docs ...

Các con trỏ phải bao gồm một cột có tên là "_id" hoặc lớp này sẽ không hoạt động. Ngoài ra, việc sử dụng MergeCursor với lớp này sẽ không hoạt động nếu các Con trỏ đã hợp nhất có các giá trị trùng lặp trong cột "_id" của chúng.

Cursor là:

Giao diện này cung cấp ngẫu nhiên đọc-ghi truy cập vào các tập kết quả trả về bởi một truy vấn cơ sở dữ liệu.

Nói cách khác, bạn cần _id dành cho Android SQLite (mà thường sử dụng con trỏ)

+0

Bạn có biết '_id' phải là số nguyên hay' _id VARCHAR PRIMARY KEY' là đủ? –

5

Nếu bạn xác định cột _id của bạn như là một số nguyên autoincrementing nó thực sự là một bí danh cho cột ROWID rằng SQLite cung cấp theo mặc định (https://www.sqlite.org/lang_createtable.html#rowid).

của bạn tạo ra nhu cầu tuyên bố mang hình thức ...

CREATE TABLE t(_id INTEGER PRIMARY KEY ASC, y, z); 

Để chứng minh việc này ...

UPDATE t SET _id=22 WHERE _id=11; 

sau đó

SELECT ROWID, _id FROM t; 

và bạn sẽ tìm thấy cả hai _idROWID có cùng giá trị.

Lưu ý rằng nếu bạn sử dụng DESC trong cột TẠO mới sẽ được tạo và ROWID không được đặt bí danh.

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