Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    49

    Query da un singolo risultato, anziche' tutti quelli dovuti.

    Salve ragazzi, sto progettando una piccola applicazione android. Devo vedere in una listview tutti i giochi presenti su una singola piattaforma. Il problema e che la query che ho scritto mi da come risultato solamente il primo videogioco trovato nel database e non tutta la lista. Ecco la query:

    codice:
    final String query1 = "select " +  COL_CONSOLE_ID  + " from " + TABEL_CONSOLE + " WHERE " + COL_CONSOLE_NAME + " = " + "'" + console + "'";
    
    final String query2 = "select " + COL_VIDEOGAME_PLATFORM_VIDEOGAME_ID + " from " + TABEL_VIDEOGAME_PLATFORM + " WHERE " + COL_VIDEOGAME_PLATFORM_CONSOLE_ID + " = ( " + query1 + ")";
    
    String query = "select " + COL_VIDEOGAME_ID + "," + COL_VIDEOGAME_NAME + " from " + TABEL_VIDEOGAME + " WHERE " + COL_VIDEOGAME_ID + " = ( " + query2 + ");"  ;

  2. #2
    1. va indicato il db, come da regolamento
    2. fatti stampare a schermo cosa valgono le tre stringhe dopo che le hai composte, così da capire quali query vengono effettivamente eseguite
    3. potrebbe anche darsi che la query riporti n risultati, ma poi da programma (che non conosciamo) tu legga solo il primo risultato
    4. per ultimo (ma ne parliamo poi) vedo che fai tre query in cascata quando probabilmente ne basterebbe una con delle JOIN ben costruite


  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    49
    Quote Originariamente inviata da optime Visualizza il messaggio
    1. va indicato il db, come da regolamento
    2. fatti stampare a schermo cosa valgono le tre stringhe dopo che le hai composte, così da capire quali query vengono effettivamente eseguite
    3. potrebbe anche darsi che la query riporti n risultati, ma poi da programma (che non conosciamo) tu legga solo il primo risultato
    4. per ultimo (ma ne parliamo poi) vedo che fai tre query in cascata quando probabilmente ne basterebbe una con delle JOIN ben costruite

    1:

    codice:
    private void createVideoGamePlatformTable(SQLiteDatabase db) {    db.execSQL("create table " + TABEL_VIDEOGAME_PLATFORM + "(" +
                COL_VIDEOGAME_PLATFORM_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                COL_VIDEOGAME_PLATFORM_VIDEOGAME_ID + " INTEGER NOT NULL," +
                COL_VIDEOGAME_PLATFORM_CONSOLE_ID + " INTEGER NOT NULL," +
                "FOREIGN KEY( " + COL_VIDEOGAME_PLATFORM_VIDEOGAME_ID + " ) REFERENCES " + TABEL_VIDEOGAME + " (" + COL_VIDEOGAME_ID + " )" +
                "FOREIGN KEY( " + COL_VIDEOGAME_PLATFORM_CONSOLE_ID + " ) REFERENCES " + TABEL_CONSOLE + " (" + COL_CONSOLE_ID + " )" +
                ");");
    
        db.execSQL("INSERT INTO " + TABEL_VIDEOGAME_PLATFORM + "(" +
                        COL_VIDEOGAME_PLATFORM_VIDEOGAME_ID + "," +
                        COL_VIDEOGAME_PLATFORM_CONSOLE_ID + ")" +
                        "VALUES " +
                        "('1', '1')," +
                        "('1', '3')," +
                        "('1', '8')," +
                        "('2', '1')," +
                        "('2', '3')," +
                        "('2', '8')," +
                        "('3', '3')," +
                        "('4', '7')," +
                        "('5', '10')," +
                        "('6', '1')," +
                        "('6', '3')," +
                        "('6', '8');"
    );
    
    
    
    }
    
    private void createGenreTable(SQLiteDatabase db) {
        db.execSQL("create table " + TABEL_GENRE + "(" +
                COL_GENRE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                COL_GENRE_NAME + " TEXT(40) NOT NULL" +
                ");");
    
        db.execSQL("INSERT INTO " + TABEL_GENRE + "(" +
                COL_GENRE_NAME + ")" +
                        "VALUES " +
                        "('GDR'), " +
                        "('FPS'), " +
                        "('TPS'), " +
                        "('Platform')" +
                        ";"
    
    
    );
    }
    
    private void createVideoGameTable(SQLiteDatabase db) {
    
        db.execSQL("create table " + TABEL_VIDEOGAME + "(" +
                COL_VIDEOGAME_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                COL_VIDEOGAME_NAME + " TEXT(40) NOT NULL," +
                COL_VIDEOGAME_GENRE + " INTEGER," +
    
                COL_VIDEOGAME_DEVELOPER + " TEXT(25)," +
                COL_VIDEOGAME_PRODUCER + " TEXT(25)," +
                COL_VIDEOGAME_PUBLICATION + " TEXT(15)," +
                COL_VIDEOGAME_ADDED + " INTEGER," +
                "FOREIGN KEY( " + COL_VIDEOGAME_GENRE + " ) REFERENCES " + TABEL_GENRE + " (" + COL_GENRE_ID + " )" +
                ");");
    
        db.execSQL("INSERT INTO " + TABEL_VIDEOGAME + " (" +
                COL_VIDEOGAME_NAME + "," +
                COL_VIDEOGAME_GENRE + "," +
                COL_VIDEOGAME_DEVELOPER + "," +
                COL_VIDEOGAME_PRODUCER + "," +
                COL_VIDEOGAME_PUBLICATION + ","+
                COL_CONSOLE_ADDED + ")" +
                "VALUES " +
                "('Mass Effect', '1', 'BioWare', 'Eletronic Arts ','2007', '0')," + //1
    "('Mass Effect 2', '1',  'BioWare', 'Eletronic Arts ','2011', '0')," + //2
    
    "('Uncharted 3', '3', 'NaugtyDog', 'Sony ','2012', '0')," + //3
    "('Halo 5', '2', 'Bungie', 'Microsoft','2015', '0')," + //4
    "('Mario', '4', 'Nintendo', 'Nintendo ','2015', '0')," + //5
    
    "('Mass Effect 3', '1', 'BioWare', 'Eletronic Arts ','2013', '0')" + //6
    
    
    ";"
    );
    }
    
    private void createConsoleTable(SQLiteDatabase db) {
    
        db.execSQL("create table " + TABEL_CONSOLE + "( " +
                COL_CONSOLE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                COL_CONSOLE_NAME + " TEXT(40) NOT NULL," +
                COL_CONSOLE_PRODUCER + " TEX(40)," +
                COL_CONSOLE_GENERATION + " TEXT(15)," +
                COL_CONSOLE_TYPE + " TEXT(15)," +
                COL_CONSOLE_PUBLICATION + " TEXT(15)," +
                COL_CONSOLE_ADDED + " INTEGER" +
                ");");
    
    
    
        db.execSQL("INSERT INTO " + TABEL_CONSOLE + " ( " +
                        COL_CONSOLE_NAME + "," +
                        COL_CONSOLE_PRODUCER + "," +
                        COL_CONSOLE_GENERATION + "," +
                        COL_CONSOLE_TYPE + "," +
                        COL_CONSOLE_PUBLICATION + "," +
                        COL_CONSOLE_ADDED + ")" +
                        "VALUES ('PC', ' ', ' ', ' ', ' ', '0')," +                     //1
    "('Playstation 4', 'Sony', 'Octave', 'Home', ' ', '0')," + //2
    "('Playstation 3', 'Sony', 'Seventh', 'Home', ' ', '0')," + //3
    "('Playstation 2', 'Sony', 'Sixth', 'Home', ' ', '0')," + //4
    "('Playstation 1', 'Sony', 'fifth', 'Home', ' ', '0')," + //5
    "('Playstation Vita', 'Sony', 'Octave', 'Home', ' ', '0')," +  //6
    "('XboxOne', 'Microsoft', 'Octave', 'Home', ' ', '0')," + //7
    "('Xbox 360', 'Microsoft', 'Seventh', 'Home', ' ', '0')," +  //8
    "('WiiU', 'Nintendo', 'Octave', 'Home', ' ', '0')," + //9
    "('Wii', 'Nintendo', 'Seventh', 'Home', ' ', '0')," + //10
    "('Playstation Portable', 'Sony', 'Seventh', 'Home', ' ', '0')" + //11
    ";"
    );
    
    }
    2: Ho testato singolarmente le query, e funzionano.
    3: il codice da programma funziona, visto che per le altre query non ho problemi a ricevere tutti i dati di cui ho bisogno. Soltanto questa query non mi funziona correttamente.

  4. #4
    dove sono le query stampate? di che db stiamo parlando?

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    49
    Scusa ma non riesco a capirti. in che senso le query stampate? Io ho tre stringhe contenete ognuna parte della query. Per testarle ho fatto eseguire le prime due query singolarmente e danno il risultato dovuto. Il risultato lo vedo su di una listView all'interno di una App android.

  6. #6
    ok. se io scrivo

    sql = "SELECT nome FROM Clienti WHERE ClienteId=" & ClienteId

    se ClienteId vale 9, stampando a schermo la variabile sql avrò

    SELECT nome FROM Clienti WHERE ClienteId=9

    ecco, serve la stessa cosa con le tue

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    49
    Ho stampato a video questo:

    select _id,NAME from Videogame_table WHERE _id = (select VIDEOGAME_id from Videogameplatform_ table WHERE CONSOLE_id = (select _id from Consol_table WHERE NAME = 'PC'));

    l'ultima query da come risultato 1, essendo il PC la prima riga, la seconda query dovrebbe dare come risultato 1, 2, 6 e quindi la terza query dovrebbe dare come risultato MASS EFFECT, MASS EFFECT 2, MASS EFFECT 3.

    Ora spero che ho risposto alla tua domanda in modo chiara

  8. #8
    se tu esegui quella query direttamente sul db, quanti risultati ottieni?

  9. #9
    e probabilmente il problema risiede nel fatto che usi = invece di IN(); e comunque io riscriverei la query usando delle JOIN. Ammesso che il db (che ancora non sappiamo quale sia - forse SQLite?) le supporti

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    49
    Scusami, pensavo di averlo specificato.. Comunque si uso SQLlite direttamente nel progetto Android. Comunque provando con IN funziona, grazie. Pensi che se usassi JOIN sarebbe piu performante?

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.