2010-07-07 11 views
62

Il campo "_id" è necessario in Android SQLite?Informazioni sul campo "_id" in Android SQLite

+0

per chiunque stia toccando la pagina controlla questo https://www.sqlite.org/autoinc.html questo è veramente utile. Leggi in particolare la cosa 'ROWID'. –

+0

La risposta corretta sarebbe "NO". Poiché il motore di database SQlite dispone già di un meccanismo che crea un ROWID univoco per ogni nuova riga inserita. E se la tua tabella ha un 'PRIMARY_KEY' allora diventerà l'alias di quel' ROW_ID'. –

risposta

52

_id è utile quando si utilizzano gli adattatori avanzati che fanno uso di un cursore (ad esempio ResourceCursorAdapter). Viene utilizzato da questi adattatori per fornire un ID che può essere utilizzato per fare riferimento alla riga specifica nella tabella che mette in relazione l'elemento in qualunque sia l'adattatore utilizzato (ad esempio una riga in un ListView).

Non è necessario se non si intende utilizzare classi che richiedono una colonna _id in un cursore e si può anche usare "come _id" per far apparire un'altra colonna come se fosse _id nel cursore.

+0

Grazie, esattamente quello che stavo cercando di imparare. –

8

In molti casi è molto conveniente avere un campo ID. Preferisco che il mio sia autoincremento (come mostrato sotto). Sto sempre trovando nuovi usi per il campo id :)

Quando arriva il momento di collegare i dati ad un adattatore, mi piace usare un alias nome di tabella per interrogare il campo id come _id. Esempio: . In questo modo l'adattatore vede un campo chiamato _id e tutti sono felici.

Ecco un esempio di come definisco le mie tabelle:

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

dovrebbe essere "_id"? – Dori

+1

'..., timestamp TIMESTAMP, ...' è possibile anche. – SK9

+3

nota che 'AUTOINCREMENT' non è necessario a meno che non si voglia assicurare che durante la vita del database lo stesso ID non venga riutilizzato. http://www.sqlite.org/autoinc.html – forcewill

21

Perché non fanno uso di _ROWID_?

SQLite fornisce comunque questo valore per ogni riga, in modo tale da poterlo solo aggiungere a _id nell'istruzione select.

+1

Bel trucco. Se crei una tabella con _id (essendo mappato su ROWID), è più semplice. –

+2

@greenrobot, qual è la sintassi per questo? – Dori

+3

@Dori Controlla http://www.sqlite.org/lang_createtable.html#rowid –

10

Tecnicamente non il campo _id non è necessaria, se si stanno facendo uso della classe CursorAdapter (che probabilmente si è, soprattutto se si sta lavorando con l'esempio Blocco note) allora sì

"Il Cursore deve includere una colonna denominata "_id" o questa classe non sarà lavoro"

come spiegato nella documentazione here. Sfortunatamente gli esempi di codice non lo rendono molto chiaro.

0

Ovviamente se si sta creando il proprio widget dell'interfaccia utente e il proprio adattatore, non è necessario denominare la chiave primaria come "_id". Può essere qualsiasi nome tu voglia. Ma tu saresti responsabile della gestione delle raccolte di widget dell'interfaccia utente e legandoli alla riga giusta nel tuo database. "_id" è utile solo per ListView come ha sottolineato Brad.

5

Dal official docs ...

il cursore deve includere una colonna denominata "_id" o questa classe non funzionerà. Inoltre, l'utilizzo di MergeCursor con questa classe non funzionerà se i Cursori uniti hanno valori sovrapposti nelle rispettive colonne "_id".

E il Cursor è:

Questa interfaccia fornisce l'accesso casuale in lettura e scrittura per il set di risultati restituito da una query di database.

In altre parole, è necessario _id per Android SQLite (che di solito usa Cursore)

+0

Sapete che '_id' dovrebbe essere intero o un' _id VARCHAR PRIMARY KEY' è sufficiente? –

5

Se si definisce la colonna _id come un intero autoincrementing in realtà è un alias per la colonna ROWID che SQLite fornisce di default (https://www.sqlite.org/lang_createtable.html#rowid).

tuo creano esigenze economico assumono la forma ...

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

Per dimostrare questo funziona ...

UPDATE t SET _id=22 WHERE _id=11; 

poi

SELECT ROWID, _id FROM t; 

e troverete sia _id e ROWID hanno lo stesso valore.

Si noti che se si utilizza DESC in CREATE viene creata una nuova colonna e ROWID non è sottoposto ad alias.