Autore Topic: Ordinamento Tabella  (Letto 258 volte)

Offline MarcoMarco

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
Ordinamento Tabella
« il: 24 Settembre 2016, 11:23:35 CEST »
0
Salve a tutti

Ultimamente mi sto cimentando sulla gestione di database

Ma mi sono purtroppo bloccato su come ordinare i valori di una tabella

Per esercitarmi avevo creato una piccola app con solo una listview un bottone e un database
All'avvio l'applicazione crea dei valori numeri ad esempio (9, 5 ,8 ,7 ,1 ,3) che vengono memorizzati nella tabella del database con questo ordine

La listview visualizza i dati contenenti nella tabella
 il bottone invece al suo clic avrebbe ordinato la tabella e di conseguenza nella listview sarebbero comparsi i valori ordinati


Il problema e che non riesco a ordinare la tabella ho provato diversi modi  ma da sempre errore

vi faccio vedere uno dei modi che ho provato per ordinare la tabella

Ecco il codice della classe MainActivity:

Codice (Java): [Seleziona]
public class MainActivity extends AppCompatActivity {

    DB db=new DB(this);
    Cursor crs;
    CursorAdapter cursoradapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView listView= (ListView) findViewById(R.id.listView);
        Button b=(Button) findViewById(R.id.button);


        db.cancella();
        db. inserimento();




        Cursor crs=db.query_cursor();
        cursoradapter=new CursorAdapter(this, crs, 0) {
            @Override
            public View newView(Context context, Cursor cursor, ViewGroup parent) {

                View v=getLayoutInflater().inflate(R.layout.row, null);
                return v;
            }

            @Override
            public void bindView(View v, Context arg1, Cursor crs) {

                String numero;

                numero=crs.getString(crs.getColumnIndex(db.FIELD_INTERO));


                TextView txt=(TextView) v.findViewById(R.id.textView);
                txt.setText(numero);

                }


            @Override
            public long getItemId(int position)
            {
                Cursor crs=cursoradapter.getCursor();
                crs.moveToPosition(position);
                return crs.getLong(crs.getColumnIndex(db.ID_TBL));
            }
        };
        listView.setAdapter(cursoradapter);


    }




    public void ordina(View view){

        db.ordinamento();

    }
}

Ed ecco il codice della classe dove ho creato il DataBase:

Codice (Java): [Seleziona]
public class DB extends SQLiteOpenHelper {

   public final static String Database_Name="database_ordinamento_6";

    public final static int Database_Version=1;

    //tabella da ordinare
    public final static String TBL="tabella";
    public final static String ID_TBL="_id";
    public final static String FIELD_INTERO="intero";

    //tabella ordinata
    public final static String TBL_ORDINATA="tabella_ordinata";
    public final static String ID_ORDINATA="_id";
    public final static String FIELD_INTERO_ORDINATO="intero";



    public DB(Context context) {
        super(context, Database_Name, null, Database_Version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL("CREATE TABLE " + TBL + " (_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                FIELD_INTERO +" INTEGER)");


        db.execSQL("CREATE TABLE " + TBL_ORDINATA + " (_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                FIELD_INTERO_ORDINATO +" INTEGER)");



    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }

    public void inserimento(){

        Cursor crs;

        SQLiteDatabase db = getWritableDatabase();
        crs = db.query(TBL, null, null, null, null, null, null, null);

        crs.moveToLast();

        ContentValues cv = new ContentValues();

        cv.put(FIELD_INTERO,"8");
        db.insert(TBL,null,cv);

        crs.moveToLast();

        cv.put(FIELD_INTERO,"5");
        db.insert(TBL,null,cv);

        crs.moveToLast();

        cv.put(FIELD_INTERO,"9");
        db.insert(TBL,null,cv);

        crs.moveToLast();

        cv.put(FIELD_INTERO,"22");
        db.insert(TBL,null,cv);

        crs.moveToLast();

        cv.put(FIELD_INTERO,"1");
        db.insert(TBL,null,cv);

    }

    public void cancella(){

    SQLiteDatabase db=getWritableDatabase();

        db.delete(TBL,null,null);

    }

    public void ordinamento(){

        SQLiteDatabase db=getWritableDatabase();



         String query = "INSERT INTO tabella_ordinata (intero) SELECT intero FROM tabella_ordinata ORDER BY intero AS;";
        db.execSQL(query);

        query = "DROP TABLE tabella ;";
        db.execSQL(query);

        query = "ALTER TABLE tabella_ordinata RENAME TO tabella ;";
        db.execSQL(query);


    }


    public Cursor query_cursor()
    {
        Cursor crs=null;
        try
        {
            SQLiteDatabase db=getReadableDatabase();
            crs=db.query(TBL, null, null, null, null, null, null, null);
        }
        catch(SQLiteException sqle)
        {
            return null;
        }
        return crs;
    }
}

Ho messo il metodo cancella sopra il metodo inserimento per via del fatto che ogni volta che avrei riaperto l'app avrebbe inserito costantemente altri numeri ogni volta che veniva avviato il metodo oncreate cosi almeno prima di inserire nuovi valori elimino quelli esistenti cosi da evitare una lista di numeri molto lunga

Ed ecco l'errore che mi da:

Codice (Java): [Seleziona]
Process: com.example.marco.ordinamento_tabella, PID: 8096
                                                                                     java.lang.IllegalStateException: Could not execute method for android:onClick
                                                                                         at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
                                                                                         at android.view.View.performClick(View.java:4616)
                                                                                         at android.view.View$PerformClick.run(View.java:18956)
                                                                                         at android.os.Handler.handleCallback(Handler.java:808)
                                                                                         at android.os.Handler.dispatchMessage(Handler.java:103)
                                                                                         at android.os.Looper.loop(Looper.java:193)
                                                                                         at android.app.ActivityThread.main(ActivityThread.java:5486)
                                                                                         at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                         at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829)
                                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645)
                                                                                         at dalvik.system.NativeStart.main(Native Method)
                                                                                      Caused by: java.lang.reflect.InvocationTargetException
                                                                                         at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                         at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                         at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                                                                                         at android.view.View.performClick(View.java:4616)
                                                                                         at android.view.View$PerformClick.run(View.java:18956)
                                                                                         at android.os.Handler.handleCallback(Handler.java:808)
                                                                                         at android.os.Handler.dispatchMessage(Handler.java:103)
                                                                                         at android.os.Looper.loop(Looper.java:193)
                                                                                         at android.app.ActivityThread.main(ActivityThread.java:5486)
                                                                                         at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                         at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829)
                                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645)
                                                                                         at dalvik.system.NativeStart.main(Native Method)
                                                                                      Caused by: android.database.sqlite.SQLiteException: near "AS": syntax error (code 1): , while compiling: INSERT INTO tabella_ordinata (intero) SELECT intero FROM tabella_ordinata ORDER BY intero AS;
                                                                                         at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                                                         at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:893)
                                                                                         at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:504)
                                                                                         at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:589)
                                                                                         at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                                                                                         at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
                                                                                         at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1697)
                                                                                         at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1628)
                                                                                         at com.example.marco.ordinamento_tabella.DB.ordinamento(DB.java:105)
                                                                                         at com.example.marco.ordinamento_tabella.MainActivity.ordina(MainActivity.java:80)
                                                                                         at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                         at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                         at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                                                                                         at android.view.View.performClick(View.java:4616)
                                                                                         at android.view.View$PerformClick.run(View.java:18956)
                                                                                         at android.os.Handler.handleCallback(Handler.java:808)
                                                                                         at android.os.Handler.dispatchMessage(Handler.java:103)
                                                                                         at android.os.Looper.loop(Looper.java:193)
                                                                                         at android.app.ActivityThread.main(ActivityThread.java:5486)
                                                                                         at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                         at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829)
                                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645)
                                                                                         at dalvik.system.NativeStart.main(Native Method)

Il punto più saliente e forse questo:

Codice (Java): [Seleziona]
Caused by: android.database.sqlite.SQLiteException: near "AS": syntax error (code 1): , while compiling: INSERT INTO tabella_ordinata (intero) SELECT intero FROM tabella_ordinata ORDER BY intero AS;
                                                                                         at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                                                         at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:893)
                                                                                         at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:504)
                                                                                         at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:589)
                                                                                         at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                                                                                         at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
                                                                                         at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1697)
                                                                                         at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1628)
                                                                                         at com.example.marco.ordinamento_tabella.DB.ordinamento(DB.java:105)
                                                                                         at com.example.marco.ordinamento_tabella.MainActivity.ordina(MainActivity.java:80)
                                                                                         at java.lang.reflect.Method.invokeNative(Native Method)

Spero che qualcuno di voi riesca a capire il problema  :'( Grazie

Offline DCode

  • Utente junior
  • **
  • Post: 69
  • Respect: +20
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 16.04 LTS
Re:Ordinamento Tabella
« Risposta #1 il: 24 Settembre 2016, 23:31:37 CEST »
+1
Il crash è dovuto alla query che fai eseguire tu nel metodo ordinamento()

Citazione
INSERT INTO tabella_ordinata (intero) SELECT intero FROM tabella_ordinata ORDER BY intero AS;
E non capisco cosa tu voglia fare con questa query.

Comunque per ordinarli ti basterebbe fare una query del tipo
Codice: [Seleziona]
SELECT intero FROM tabella ORDER BY intero ASCdirettamente sulla tabella che si chiama appunto "tabella", dopo aver inserito i valori, evitando di appoggiarti e utilizzare altre tabelle.

Il cursore che ti ritorna questa query, lo usi poi con l'adapter per la tua ListView.
« Ultima modifica: 24 Settembre 2016, 23:33:45 CEST da DCode »
┻━┻ ︵ヽ(°□°ヽ) Develop w/ ( ( ObjC || Swift ) && Java[ "Android" ] ) (╯°□°)╯︵ ┻━┻

Offline MarcoMarco

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
Re:Ordinamento Tabella
« Risposta #2 il: 25 Settembre 2016, 12:55:29 CEST »
0
Grazie per la risposta DCode

Ho provato il tuo consiglio ed in effetti l'errore non c'è più ma ancora non funziona come vorrei


Al clic del bottone faccio partire un metodo per ordinare la tabella che successivamente ritorna il cursore che metterò nel cursoradapter della listview ma non so per quale motivo dopo il clic la listview diventa vuota come se non ci fosse più nessun elemento nella tabella
Il codice del metodo è questo

Codice (Java): [Seleziona]
public Cursor query_cursor_ordinato()
    {
        Cursor crs=null;
        try
        {

            SQLiteDatabase db=getWritableDatabase();
            String query_selezione = "SELECT intero FROM tabella ORDER BY intero ASC";
            db.execSQL(query_selezione);

            db=getReadableDatabase();
            crs =db.query(TBL,null,null,null,null,null,null,null);

        }
        catch(SQLiteException sqle)
        {
            return null;
        }
        return crs;
    }

Sbaglio qualche procedimento nel codice che ti ho postato ?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1169
  • Respect: +56
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Ordinamento Tabella
« Risposta #3 il: 25 Settembre 2016, 12:59:27 CEST »
0
Controlla che UK cursore non sia vuoto

Offline MarcoMarco

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
Re:Ordinamento Tabella
« Risposta #4 il: 25 Settembre 2016, 17:19:35 CEST »
0
Controllato non è vuoto

Ho fatto diverse prove ed ho notato che la listview diventa sempre vuota quando si usa questo pezzo di codice

Codice (Java): [Seleziona]
Cursor crs;
        try
        {

            SQLiteDatabase db=getWritableDatabase();       //!!!
            String query_selezione = "SELECT intero FROM tabella ORDER BY intero ASC";     //!!!
            db.execSQL(query_selezione);        //!!!!
           

        db=getReadableDatabase();
            crs =db.query(TBL,null,null,null,null,null,null,null);

        }
        catch(SQLiteException sqle)
        {
            return null;
        }
        return crs;

per l'esattezza solo 3 righe che ho segnato con dei punti esclamativi, tolte quelle la listview una volta cliccato il bottone per ordinare non diventa vuota, ovviamente però il risultato che mi da rimane invariato a prima.

Sapete se sto tralasciando o sbagliando qualche passaggio ?

Offline capitancooker

  • Utente junior
  • **
  • Post: 56
  • Marco
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5, Asus Zenpad S 8.0
  • Sistema operativo:
    Mac OSX El Capitan
Re:Ordinamento Tabella
« Risposta #5 il: 25 Settembre 2016, 18:38:26 CEST »
0
Non ho letto tutto il tuo codice ma dal comportamento che rilevi sembra che l'adapter non abbia più il riferimento al nuovo Cursor. Prova ad aggiornarlo con cursoradapter.changeCursor(crs).
Ciao,
Marco
Se sbaglio, correggetemi.

Offline DCode

  • Utente junior
  • **
  • Post: 69
  • Respect: +20
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 16.04 LTS
Re:Ordinamento Tabella
« Risposta #6 il: 25 Settembre 2016, 20:00:44 CEST »
+1
Cito dal sito developer di android
Off-Topic:
execSQL(String sql)
Execute a single SQL statement that is NOT a SELECT or any other SQL statement that returns data.

Ora ci sono due modi per farti ritornare il cursore che ti serve.
Il primo utilizzando rawQuery( ... )
Codice (Java): [Seleziona]
Cursor cursor = db.rawQuery("SELECT intero FROM tabella ORDER BY intero ASC");altrimenti utilizzando query( ... )
Codice (Java): [Seleziona]
Cursor cursor = db.query( "tabella", new String[] { "intero" }, null, null, null, null, "intero ASC" )( per ulteriori informazioni sui metodi, dai sempre un'occhiata alla documentazione di android )

Poi una volta eseguita una di queste due istruzioni ( prima devi eseguire getWritableDatabase() sulla variabile che io ho chiamato db ), questo non è necessario
Codice (Java): [Seleziona]
db=getReadableDatabase();
crs =db.query(TBL,null,null,null,null,null,null,null);
puoi fare direttamente la return del cursore.

A disposizione per chiarimento!
Buona serata!
« Ultima modifica: 25 Settembre 2016, 20:03:18 CEST da DCode »
┻━┻ ︵ヽ(°□°ヽ) Develop w/ ( ( ObjC || Swift ) && Java[ "Android" ] ) (╯°□°)╯︵ ┻━┻

Offline MarcoMarco

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
Re:Ordinamento Tabella
« Risposta #7 il: 27 Settembre 2016, 22:39:07 CEST »
0
Ciao DCode ho fatto come mi hai detto tu ma mi dava un errore diceva che mancava una colonna _id

ho semplicemente risolto aggiungendo alla riga di codice
Codice (Java): [Seleziona]
Cursor cursor = db.query( "tabella", new String[] { "intero" }, null, null, null, null, "intero ASC" )
l'elemento _id facendo diventare la riga così

Codice (Java): [Seleziona]
Cursor cursor = db.query( "tabella", new String[] { "_id,intero" }, null, null, null, null, "intero ASC" )
E dopo aver messo questo piccolo dettaglio mi ha finalmente ordinato la tabella :D

Ti ringrazio per l'aiuto che mi hai dato  :D