Autore Topic: Ordinare un Database - Loader  (Letto 588 volte)

Offline xwilly84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p9 lite
  • Play Store ID:
    Luca Chirichella
  • Sistema operativo:
    Win 8.1 x64
Ordinare un Database - Loader
« il: 30 Agosto 2017, 17:16:09 CEST »
0
Salve a tutti, ho un problema su come ordinare un database tramite il metodo Loader.

Allora ho implementato:
Database
ContentProvider
LoaderCallbacks

Fin qui tutto ok riesco a visualizzare il mio CursorAdapter tramite onCreateLoader.
Nella mia FragmentActivity quando viene richiamato il metodo onCreate, funziona tutto perfettamente.

cursorLoader = new CursorLoader(getApplicationContext(),
ProviderTestDb.CONTENT_URI, allColumns, null, null, null);

L'unica cosa che riesco a gestire è uno metodo switch che recupera una variabile String tramite SharedPreferences.
così mi permette di ordinare in onCreateLoader, ad ogni scelta che effettua l'utente.

La mia domanda: è possibile cambiare l'ordine del mio database in tempo reale, tramite click da un menu?

Grazie in anticipo.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 804
  • Respect: +168
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Ordinare un Database - Loader
« Risposta #1 il: 31 Agosto 2017, 09:39:58 CEST »
+1
L'ultimo parametro del costruttore di CursorLoader è per l'ordinamento:

Codice (Java): [Seleziona]
cursorLoader = new CursorLoader(getApplicationContext(),
ProviderTestDb.CONTENT_URI, allColumns, null, null, "NomeColonna ASC");

Usi "ASC" o "DESC" per gli ordinamenti crescenti o decrescenti, rispettivamente.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline xwilly84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p9 lite
  • Play Store ID:
    Luca Chirichella
  • Sistema operativo:
    Win 8.1 x64
Re:Ordinare un Database - Loader
« Risposta #2 il: 31 Agosto 2017, 19:04:17 CEST »
0
Grazie per avermi risposto.
Allora Il problema è che non riesco a richiamare il metodo ogni volta che mi serve durante l'esecuzione dell'activity.
Tipo da un menu ho bisogno che cambi ordinamento in tempo reale.


Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 804
  • Respect: +168
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Ordinare un Database - Loader
« Risposta #3 il: 01 Settembre 2017, 09:12:18 CEST »
+1
Al click del menù determini l'ordinamento da applicare, carichi il nuovo cursore e lo sostituisci a quello esistente.

Per altri dettagli dovrei vedere il codice
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline xwilly84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p9 lite
  • Play Store ID:
    Luca Chirichella
  • Sistema operativo:
    Win 8.1 x64
Re:Ordinare un Database - Loader
« Risposta #4 il: 01 Settembre 2017, 16:35:30 CEST »
0
In sintesti i valori vengono inseriti nel database poi richiamati tramite la classe provider, poi mostrati e gestiti tramite la classe estesa cursoradapter in una listview.
Mostro il codice in sintesi nell'activity main.

//var
String[] allColumns = { "DBTest.COLUMN_id", "DBTest.COLUMN_texto1", "DBTest.COLUMN_texto2", "DBTest.COLUMN_number1", "DBTest.COLUMN_number_2" };

//onCreate
getSupportLoaderManager().initLoader(0, null, this);
adapter = new TestAdapter(this, null, 0);
list.setAdapter(adapter);

//onCreateLoader
if(....== _id){
cursorLoader = new CursorLoader(getApplicationContext(), TestProvider.CONTENT_URI, allColumns, null, null, DBTest.COLUMN_id);
}else{
cursorLoader = new CursorLoader(getApplicationContext(), TestProvider..CONTENT_URI, allColumns, null, null, DBTest.COLUMN_number1);
}

//onLoadFinished
adapter.swapCursor(cursor);

//onLoaderReset
adapter.swapCursor(null);

Se gestico tutto in una string Shaderpreference posso ogni volta che ricarica l'activity in onResume cambiare l'ordine.
Ma a me interessa cambiarlo durante l'esecuzione.
Es. al click di un pulsante o gestito tramite uno spinner ect...


« Ultima modifica: 01 Settembre 2017, 16:42:05 CEST da xwilly84 »

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 804
  • Respect: +168
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Ordinare un Database - Loader
« Risposta #5 il: 04 Settembre 2017, 22:26:26 CEST »
+1
Al click del pulsante prova ad aggiornare le sharedpreferences e poi chiamare

Codice (Java): [Seleziona]
getSupportLoaderManager().restartLoader(0, null, this);
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline xwilly84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p9 lite
  • Play Store ID:
    Luca Chirichella
  • Sistema operativo:
    Win 8.1 x64
Re:Ordinare un Database - CursorLoader
« Risposta #6 il: 07 Settembre 2017, 00:07:28 CEST »
0
Grazie @Ohmnibus, per ora sembra andare.
Riporto qui il codice: ;)

Codice (Java): [Seleziona]
public class Test extends FragmentActivity implements LoaderCallbacks<Cursor>, OnClickListener {

public static TestAdapter adapter;
public static ListView list;

public static final String PREFS = "Prefs";
SharedPreferences preferences;
String orderByColumn;

CursorLoader cursorLoader;
private static final int LOADER = 0;
String[] allColumns = { "DBTest.COLUMN_id", "DBTest.COLUMN_number" };


        /////////////////////////////////////////////////////////////////////
        //      OnCreate
        /////////////////////////////////////////////////////////////////////

       @Override
       protected void onCreate(Bundle savedInstanceState) {
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
       super.onCreate(savedInstanceState);
       setContentView(R.layout._layout_test);

       preferences = getSharedPreferences(PREFS, 0);
       orderByColumn = preferences.getString("order", "_id");

       getSupportLoaderManager().initLoader(LOADER, null, this);
       adapter = new TestAdapter(this, null, 0);
       list.setAdapter(adapter);


       }







        /////////////////////////////////////////////////////////
        //  Cursor Loader
        /////////////////////////////////////////////////////////

        @Override
        public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {



                switch (orderByColumn) {

                        case "_id":
                        cursorLoader = new CursorLoader(getApplicationContext(),
                        ProviderLibretto.CONTENT_URI, allColumns, null, null, orderByColumn);
                        break;

                        case "_number":
                        cursorLoader = new CursorLoader(getApplicationContext(),
                        ProviderLibretto.CONTENT_URI, allColumns, null, null, orderByColumn);
                        break;

                        default:
                        break;

                }


                return cursorLoader;
        }

        @Override
        public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
                adapter.swapCursor(cursor);
        }

        @Override
        public void onLoaderReset(Loader<Cursor> loader) {
                adapter.swapCursor(null);
        }








        /////////////////////////////////////////////////////////////////////
        //      OnClickListener SortDBbyButton
        /////////////////////////////////////////////////////////////////////

        @Override
        public void onClick(View v) {


                switch (v.getId()) {


                        case R.id.btn_id:

                        orderByColumn = "_id";
                        getSupportLoaderManager().restartLoader(LOADER, null, Test.this);
                        editor.putString("order", "_id").commit();
                       
                        break;

                        case R.id.btn_number:

                        orderByColumn = "_number";
                        getSupportLoaderManager().restartLoader(LOADER, null, Test.this);
                        editor.putString("order", "_number").commit();
                       
                        break;

                        default:
                        break;
               

                        }


}

« Ultima modifica: 07 Settembre 2017, 00:10:34 CEST da xwilly84 »