Autore Topic: Database in più activity di cui una con Fragment  (Letto 582 volte)

Offline Cleon I

  • Nuovo arrivato
  • *
  • Post: 49
  • Sono l'imperatore della galassia
  • Respect: +2
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG L70, Nexus 7 2013
  • Sistema operativo:
    LinuxMint Cinnamon 17.1
Database in più activity di cui una con Fragment
« il: 23 Ottobre 2014, 09:20:15 CEST »
0
Buongiorno ho un problema sicuramente dovuto alla mia pressocche totale inesperienza

Ho seguito l'ottimo tutorial linkato http://www.anddev.it/index.php/topic,856.0.html[/url] ma ho una situazione un pò differente quindi mi trovo in difficoltà:

- Ho un'activity dove registro i dati sul db (tramite un bottone nell'actionBar usando questo codice (per ora ho piazzato dei dati di prova)

Codice (Java): [Seleziona]
package ........

import android.app.Activity;
import android.os.Bundle;
import android.widget.Spinner;
import android.widget.ArrayAdapter;
import android.view.*;
import android.database.Cursor;
import android.widget.*;

public class AggiungiAnimale extends Activity
{

.......

        DatabaseAgenda db;

.........

@Override
        public void onCreate(Bundle savedInstanceState)
        {
.......

        db = new  DatabaseAgenda(getApplicationContext());
......

}

public void registra()
        {
                .........
                db.open();
                db.inserisciAnimale("Cecco","Maschio"); //Inserimento di prova
                db.close();
        }

Questa parte sembra funzionare, come vedrete giù ho messo un if per saltare del codice se il db è pieno, e il ho il crash solo quando ho inserito dati

Codice (Java): [Seleziona]
public static class PrincipalFragment extends Fragment
        {
                ...............
                DatabaseAgenda db;
               
                ................
               
                public PrincipalFragment()
                {
                        //Costruttore vuoto tanto per non metterlo di default
                       
                }

                @Override
                public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
                {
                        int i = getArguments().getInt(ARG_AN_NUM);
                        String contenuto = getResources().getStringArray(R.array.drawer_array)[i];
                        switch (i)
                        {
                                case 1:
                                {
                                        ...............
                                        return frammento_veterinari(rootView, contenuto);
                                       
                                }
                                case 2:
                                {
                                        View rootView = inflater.inflate(R.layout.animali_fragment,container,false);
                                        return frammento_animali(rootView,contenuto);
                                }
                                case 3:
                                {
                                        ..........
                                        return frammento_appuntamenti(rootView, contenuto);
                                }
                                case 4:
                                {
                                        //Cercare altra fonte
                                        View rootView = inflater.inflate(R.layout.licenza_fragment,container,false);
                                        WebView myWebView = (WebView) rootView.findViewById(R.id.webview);
                                        myWebView.loadUrl("[url]http://katolaz.homeunix.net/gplv3/gplv3-it-final.html");
                                        myWebView.getSettings().setBuiltInZoomControls(true);
                                        myWebView.getSettings().setDisplayZoomControls(false);
                                        return rootView;
                                }
                                default:  
                                {
                                        View rootView = inflater.inflate(R.layout.homepage_fragment,container,false);
                                        return rootView;
                                }
                               
                        }
                }

public View frammento_animali(View view, String s)
                {
                        TextView animaliTv  = (TextView ) view.findViewById(R.id.animaliTv);
                        ListView animaliLv = (ListView) view.findViewById(R.id.animaliLv);
                        db = new  DatabaseAgenda(getActivity());
                        db.open();
                        if (db.fetchAnimali().getCount() != 0)
                        {
                                Cursor c = db.fetchAnimali();
                                getActivity().startManagingCursor(c);
                                SimpleCursorAdapter adapter_c = new SimpleCursorAdapter(
                                        getActivity(),
                                        R.layout.cursor,
                                        c,
                                        new String[] {DatabaseAgenda.AnimaliMetaData.ANIMALI_NAME,             DatabaseAgenda.AnimaliMetaData.ANIMALI_SESSO},
                                        new int[] {R.id.nameTv,R.id.sessoTv});
                                animaliLv.setAdapter(adapter_c);
                                int nameCol = c.getColumnIndex(DatabaseAgenda.AnimaliMetaData.ANIMALI_NAME);
                                int sessoCol = c.getColumnIndex(DatabaseAgenda.AnimaliMetaData.ANIMALI_SESSO);
                                if (c.moveToFirst())
                                {
                                        do
                                        {
                                                animaliTv.append("Nome: "+c.getString(nameCol)+" Sesso "+ c.getString(sessoCol));
                                        } while (c.moveToNext());
                                }
                               
                        }
                        db.close();
                        return view;
                }

Vi spiego che faccio:

Ho un'activity con Navigation Drawer e nel corpo uso sempre lo stesso content poi con il case (in base alla scelta sul drawer) richamo una funzione che legge il db (se non è vuoto) e permette di aggiungere tramite un tasto sull'actionbar (che apre l'activity)
A differenza del tutorial linkato scrivo in un'activity e leggo nell'altra (e questo secondo me potrebbe funziare) ma in quella che legge ho dovuto fare delle modifiche (essendo un fragment)
Le più importanti sono:

db = new  DatabaseAgenda(getActivity()); //va bene? Mettendo getApplicationContext() ho errore di compilazione
getActivity().startManagingCursor(c); //va bene? Se non metto il getActivity davanti ho errore
            SimpleCursorAdapter adapter_c = new SimpleCursorAdapter(
               getActivity(), //va bene? this non gli piace

Praticamente ho un'inserimento senza errore, il frammento senza errore se il db è vuoto e un crash se il db è pieno.
Temo che il problema sia sulla gestione del cursor che ho praticamente tirato a indovinare
Non ho l'output di logcat poiché non avendo la possibilità di portarmi dietro il portatile sviluppo sul tablet con AIDE
Se servono altri dati chiedete


Offline Blodhgard

  • Utente junior
  • **
  • Post: 53
  • Respect: +3
    • Mostra profilo
    • Budget Veloce
  • Dispositivo Android:
    Nexus 5, S4 mini, Galaxy Tab S
  • Play Store ID:
    blodhgard
  • Sistema operativo:
    Windows 8.1
Re:Database in più activity di cui una con Fragment
« Risposta #1 il: 23 Ottobre 2014, 13:52:27 CEST »
0
Senza il logcat si può fare poco.
Comunque nella mia (limitata :-)) esperienza ho sempre usato i database in activity diverse, anche nei fragment, sempre allo stesso modo.
Per risolvere potresti creare un metodo nell'activity principale poi richiamarlo dal fragment.

Offline Cleon I

  • Nuovo arrivato
  • *
  • Post: 49
  • Sono l'imperatore della galassia
  • Respect: +2
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG L70, Nexus 7 2013
  • Sistema operativo:
    LinuxMint Cinnamon 17.1
Re:Database in più activity di cui una con Fragment
« Risposta #2 il: 24 Ottobre 2014, 11:35:32 CEST »
0
mi auto aggiorno

il db funziona poichè isolando il cursoradapter riesco a leggere il cursor e a sparare su una textview l'ultimo record

ho modificato solo questa riga:

db = new  DatabaseAgenda(view.getContext());

il problema è sicuramente in questa porzione di codice:

Codice (Java): [Seleziona]
SimpleCursorAdapter adapter_c = new SimpleCursorAdapter(
                                        view.getContext(),
                                        R.layout.cursor,
                                        c,
                                        new String[] {DatabaseAgenda.AnimaliMetaData.ANIMALI_NAME, DatabaseAgenda.AnimaliMetaData.ANIMALI_SESSO},
                                        new int[] {R.id.nameTv,R.id.sessoTv});
                                animaliLv.setAdapter(adapter_c);


poichè attivandola espole il fragment. credo di non poter seguire il consiglio di Blodgard dovendo associare l'adapter alla listview che è nel layout del fragment

Offline Cleon I

  • Nuovo arrivato
  • *
  • Post: 49
  • Sono l'imperatore della galassia
  • Respect: +2
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG L70, Nexus 7 2013
  • Sistema operativo:
    LinuxMint Cinnamon 17.1
Re:Database in più activity di cui una con Fragment
« Risposta #3 il: 31 Ottobre 2014, 17:22:29 CET »
0
Buonasera a tutti questo problema mi fa uscire pazzo ma dovrei aver capito dove sta l'ighippo

Appurato che posso leggere dal db tramite una normale textView dovrei disegnare un pò meglio la cosa e ho problemi con il cursoradapter.

Non riesco ne con il SimpleCursor ne con il CursorAdapter normale
Ho provato a mettere un cursuAdapter prendendo spunto da qui Database e SQLite | Guida Android | Mobile | HTML.it e ho capiuto dove sta l'inghippo, poichè la riga (riportata nella sezione "L’Activity ed il CursorAdapter" nel metodo newView dell'adapter)

Codice (Java): [Seleziona]
View v=getLayoutInflater().inflate(R.layout.listactivity_row, null);
mi da errore di compilazione ("This method can not be referenced from a static content")

Ho letto nella documentazione che il metodo è nella classe Activity quindi se aggiungo getActivity() prima di getLayoutInflater l'errore se ne va, ma io non devo modificare il layout dell'activity ma quello del fragment come risolvereste?
Devo usare un metodo sosttutivo? devo creare un nuovo Inflater?
Avevo errori anche in ogni riga relativa ai db con scritto this e ho risolto con un view.getContext visto che volevano tutte un parametrno dsi tipo Context

Offline Cleon I

  • Nuovo arrivato
  • *
  • Post: 49
  • Sono l'imperatore della galassia
  • Respect: +2
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG L70, Nexus 7 2013
  • Sistema operativo:
    LinuxMint Cinnamon 17.1
Re:Database in più activity di cui una con Fragment
« Risposta #4 il: 28 Novembre 2014, 11:10:32 CET »
0
Ho risolto in maniera autonoma ecco il listato del SimpleCursorAdapter corretto:

Codice (Java): [Seleziona]
public View frammento_animali(View view)
                {
                        animaliLv = (ListView) view.findViewById(R.id.animaliLv);
                        db = new  DatabaseAgenda(view.getContext());
                        db.open();
                        Cursor c = db.fetchAnimali();
                        SimpleCursorAdapter cur = new SimpleCursorAdapter(
                                getActivity(),
                                android.R.layout.simple_list_item_2,
                                c,
                                new String[] {DatabaseAgenda.AnimaliMetaData.ANIMALI_NAME, DatabaseAgenda.AnimaliMetaData.ANIMALI_RAZZA},
                                new int[]{android.R.id.text1, android.R.id.text2},
                                0);
                        animaliLv.setAdapter(cur);
                        db.close();
                        return view;
                }

Il problema stava alla fine di tutto, prima di db.close(); inserivo un c.close(); che mandava tutto in crash

Ricordo che questo è un esempio di uso database, SimpleCursorAdapter e NavigationDrawer, appena posso posto uno screenshot del risultato
« Ultima modifica: 28 Novembre 2014, 11:13:04 CET da Cleon I »