JavascriptProva

venerdì 15 gennaio 2016

Sperimentando queries su Android.

Realizzare un database con due tavole: una con tre campi e una con due campi con un campo dallo stesso nome.
Fatto. Ambedue con tre campi di cui un _id e altri due...

Adesso devo costruire una query JOIN.
Vediamo se mi riesce...

Intanto faccio delle prove in modo graduale.
Seleziono alcuni campi di una tabella invece di selezionarli tutti. Non vi figura il campo _id
Ogni volta che tento di inserire un valore in un campo UNIQUE, se il valore è già presente, ottengo un messaggio di errore con "Is not unique", ma non si tratta di un errore fatale.
Ottengo poi un messaggio di errore fatale, con crash dell'applicazione, quando invece il CursorAdapter non trova il campo _id in quanto questo è omesso dalla selezione nella query.
Tolgo la condizione UNIQUE per evitare di ottenere quei messaggi di errore che mi rendono più difficile la lettura del LogCat, e faccio ripartire il programma. Strano che gli errori "is not unique" mi figurano ugualmente.
Tralascio almeno al momento questo particolare, e trovo l'errore FATALE:
01-12 22:23:02.175: E/AndroidRuntime(26294): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.lab10/com.example.lab10.MainActivity}: java.lang.IllegalArgumentException: column '_id' does not exist
Ora applico quel trucco dell'aggiungere a uno dei campi selezionati "AS _id", e vediamo:
		public Cursor query(){
			SQLiteDatabase db=this.getWritableDatabase();
			Cursor crs=db.rawQuery("SELECT NOME AS _id,CATEGORIA FROM TABELLA", null);
			return crs;
		}
E vediamo se ottengo ancora errori fatali...

No! Non ho trovato nessun messaggio di errore! Dunque, se voglio selezionare campi in cui non vi sia compreso _id, o se la tabella semplicemente non possiede un campo chiamato _id, basta aggiungere quelle due paroline e il problema è risolto! Ora, dato che il mio codice inserisce valori anche in un'altra tabella, provo a selezionare da tabelle multiple!

Creo campi e record come li ho creati in quel mio piccolo esercizio con Access...

Una tabella Padri e una tabella Figli, la prima con i campi id e nome, la seconda con i campi extId e nome. Ne do qui una rappresentazione:
IDNome
1Mario
2Antonio
3Giuseppe
4Luigi


IDextIdNome
11Pierino
22Carletto
31Gigetto
43Paolino
12Checco
22Dadino
31Lallo
43Bobo


Creo la tabella:
		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL("CREATE TABLE TABELLA(_id INTEGER PRIMARY KEY, NOME TEXT)");
			db.execSQL("CREATE TABLE TAB2(_id INTEGER PRIMARY KEY, ExtID INTEGER, NOME TEXT)");
		}
E la riempio...

Ho creato due metodi per il riempimento della prima e della seconda tabella.
		public void save(String nome){
			SQLiteDatabase db=this.getWritableDatabase();
			ContentValues values=new ContentValues();
			values.put("NOME", nome);
			db.insert("TABELLA", null, values);
			
		}
		
		public void save2(int extId, String nome){
			SQLiteDatabase db=this.getWritableDatabase();
			ContentValues values=new ContentValues();
			values.put("ExtId",extId);
			values.put("NOME", nome);
			db.insert("TAB2", null, values);
			
		}
Ora mi esercito a creare diversi tipi di query, mediante l'uso del SQL.

Ecco una query, che ho creato dopo aver sperimentato query più semplici che non è il caso di riportare, perché fatte solo per verificare che non commettessi errori di sintassi.
		public Cursor query(){
			SQLiteDatabase db=this.getWritableDatabase();
			Cursor crs=db.rawQuery("SELECT TABELLA.NOME AS _id,TAB2.NOME FROM TABELLA,TAB2 WHERE TABELLA._ID = TAB2.EXTID", null);
			return crs;
		}
Ora provo a ottenere lo stesso risultato con il JOIN.
		public Cursor query(){
			SQLiteDatabase db=this.getWritableDatabase();
			Cursor crs=db.rawQuery("SELECT TABELLA.NOME AS _id,TAB2.NOME FROM TABELLA INNER JOIN TAB2 ON TABELLA._ID = TAB2.EXTID", null);
			return crs;
		}




Bene.
Il risultato è quello voluto ad eccezione dell'ordine.
Come si fa a ordinare in ordine alfabetico i records?

Ma sì: con la clausola ORDER BY:
		public Cursor query(){
			SQLiteDatabase db=this.getWritableDatabase();
			Cursor crs=db.rawQuery("SELECT TABELLA.NOME AS _id,TAB2.NOME FROM TABELLA INNER JOIN TAB2 ON TABELLA._ID = TAB2.EXTID ORDER BY TABELLA.NOME", null);
			return crs;
		}
Ed ecco:



...e non ci sono problemi!

Nessun commento:

Posta un commento