IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Utiliser un adaptateur sur une ArrayList d'objets sans passer par un tableau de String


Sujet :

Android

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut Utiliser un adaptateur sur une ArrayList d'objets sans passer par un tableau de String
    Bonjour à tous,

    Je suis en train de débuter en dév Android, et voici ma question. Je dispose d'une ArrayList d'objets de type Flight créés par moi-même, qui ont, entre autres, deux attributs au format String, Reference et Name.

    Ce que je voudrais, c'est un adaptateur sur cette ArrayList, qui affiche dans une ListView, les deux attributs texte de chaque objet contenu dans l'ArrayList.

    Seulement, en suivant un tutoriel Android , on veut me faire croire qu'il faut passer par un tableau de Strings à double entrée, puis une liste de HashMaps, puis une HashMap provisoire...etc. etc.

    Exemple basé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    flightList = (ListView) findViewById(R.id.flightList);
            
            ArrayList<Flight> myFlights = new ArrayList<Flight>();
            myFlights.add(new Flight("BLABLA1","TOTO1",System.currentTimeMillis()));
            myFlights.add(new Flight("BLABLA2","TOTO2",System.currentTimeMillis()));
            
            //Concept de SingleAdapter du SDZ
            String[][] repertoire = new String[myFlights.size()][3];
            for (int i=0; i<myFlights.size(); i++)
            {
    	        repertoire[i][0]=myFlights.get(i).getReference();
    	        repertoire[i][1]=myFlights.get(i).getLastname();
    	        repertoire[i][2]=""+myFlights.get(i).getDate();
            }
                
            List<HashMap<String, String>> liste = new ArrayList<HashMap<String, String>>();
                
            HashMap<String, String> element;
            for(int i = 0 ; i < repertoire.length ; i++) 
            {
                element = new HashMap<String, String>();
                element.put("text1", repertoire[i][0]);
                element.put("text2", repertoire[i][1]);
                liste.add(element);
            }
                
            ListAdapter adapter = new SimpleAdapter(this, liste, android.R.layout.simple_list_item_2, new String[] {"text1", "text2"}, new int[] {android.R.id.text1, android.R.id.text2 });
            flightList.setAdapter(adapter);
    Ouille, ouille, ouille, je suis sûr qu'il y a plus simple que d'utiliser toutes ces listes quand même, bonjour les perfs, sinon.

    Quelqu'un peut me mettre sur la voie?
    Merci d'avance.

  2. #2
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Je te conseils de créer toi-même ton adapter, c'est tout con à faire.

    SimpleAdapter sert, comme son nom l'indique, dans des cas simples et bateaux.

    Un truc vite fait :

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    public class MyFlightAdapter extends BaseAdapter
    	{
     
    	private List<Flight> flightList = new ArrayList<Flight>();
     
    	private Context context;
     
    	public MyFlightAdapter(Context context)
    		{
    			this.context = context;
    		}
     
     
    	@Override
    	public int getCount()
    		{
    			return flightList.size();
    		}
     
    	@Override
    	public Object getItem(int i)
    		{
    			return flightList.get(i);
    		}
     
    	@Override
    	public long getItemId(int i)
    		{
    			return i;
    		}
     
    	@Override
    	public View getView(int i, View view, ViewGroup viewGroup)
    		{
     
    			MyFlightAdapter.FlightHolder holder;
     
    			if (view == null)
    				{
    					view = View.inflate(context, R.layout.listitem, viewGroup);
    					holder = new MyFlightAdapter.FlightHolder();
    					holder.setFlightName((TextView) view.findViewById(R.id.first));
    					holder.setFlightReference((TextView) view.findViewById(R.id.second));
    					view.setTag(holder);
    				}
    			else
    				{
    					holder = (MyFlightAdapter.FlightHolder) view.getTag();
    				}
     
    			holder.getFlightName().setText(flightList.get(i).getName());
    			holder.getFlightReference().setText(flightList.get(i).getReference());
     
    			return view;
    		}
     
    	private class FlightHolder
    		{
    			private TextView flightName;
    			private TextView flightReference;
     
    			public TextView getFlightName()
    				{
    					return flightName;
    				}
     
    			public void setFlightName(TextView flightName)
    				{
    					this.flightName = flightName;
    				}
     
    			public TextView getFlightReference()
    				{
    					return flightReference;
    				}
     
    			public void setFlightReference(TextView flightReference)
    				{
    					this.flightReference = flightReference;
    				}
    		}
     
    	}

    Sachant que le layout listitem n'est qu'un LinearLayout avec deux TextViews.

    Pour ton besoin, il faudrait, par exemple, créer un autre constructeur pour lui passer la liste des vols.

    Pour des tutos, cherche "android ListView custom adapter", cherche du côté de BaseAdapter.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  3. #3
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Autre solution (avec moins de code), hériter de ArrayAdapter<Flight>
    et ne surcharger *que* la méthode getView (comme indiqué parfaitement par Hizin).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Merci pour vos réponses, mais finalement on m'a orienté directement sur l'usage d'une base SQLite. Les tableaux ci-dessus n'étaient utilisés que pour tester l'affichage de la ListView (SQLite exigé pour mon projet).

    Déjà, j'ai renommé Flight en Reservation. Une Reservation est composée d'un ID (long), d'une Reference et d'un LastName (Strings).

    J'ai galéré pendant 2 jours pour comprendre le fonctionnement d'une base SQLite, mais j'ai fini par y arriver. J'ai donc créé une base SQLite qui ne comprends qu'une table Reservation avec les 3 attributs mentionnés ci-dessus.

    Ce que je voudrais faire c'est:

    - Ajouter des Reservations à la base SQLite depuis l'activité principale de mon app (fait)

    - Faire en sorte que ma base soit visible par les deux activités de mon app (pour le moment j'ai déclaré l'objet SQLiteDataBase dans mes deux activités, l'activité principale appelant l'autre avec un intent sur un clic de bouton, mais je ne sais pas si c'est bon ou si la deuxième déclaration "écrase" la première base)

    - Afficher dans une ListView de la deuxième activité le contenu de la base SQLite remplie par l'activité principale (I.N.F.E.R.N.A.L!!!)

    Pour le dernier point, voici mon code:

    ReservationsBDD.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    	private static final int VERSION_BDD = 1;
    	private static final String NOM_BDD = "maBawz.db";
     
    	private static final String TABLE_RESERVATION = "Reservation";
    	private static final String COL_ID = "ID";
    	private static final int NUM_COL_ID = 0;
    	private static final String COL_REFERENCE = "Reference";
    	private static final int NUM_COL_REFERENCE = 1;
    	private static final String COL_LASTNAME = "LastName";
    	private static final int NUM_COL_LASTNAME = 2;
     
    	private SQLiteDatabase bdd; //Ceci est ma base de données SQLite
     
    	private MaBaseSQLite maBaseSQLite; //Ceci est un SQLite[Open]Helper
     
    	public ReservationsBDD(Context context){
    		//On crée la BDD et sa table
    		maBaseSQLite = new MaBaseSQLite(context, NOM_BDD, null, VERSION_BDD);
    	}
     
    	public void open(){
    		//on ouvre la BDD en écriture
    		bdd = maBaseSQLite.getWritableDatabase();
    	}
     
    	public void close(){
    		//on ferme l'accès à la BDD
    		bdd.close();
    	}
     
    	public SQLiteDatabase getBDD(){
    		return bdd;
    	}
     
    	public Cursor queueAll(){
    		String[] column = new String[]{COL_REFERENCE, COL_LASTNAME};
    		Cursor c = bdd.query(TABLE_RESERVATION, column, null, null, null, null, null);
    		return c;
    	}
     
    	public int deleteAll(){
    		return bdd.delete(TABLE_RESERVATION, null, null);
    	}
    MaBaseSQLite.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    public class MaBaseSQLite extends SQLiteOpenHelper {
     
    	private static final String TABLE_RESERVATION = "Reservation";
    	private static final String COL_ID = "ID";
    	private static final String COL_REFERENCE = "Reference";
    	private static final String COL_LASTNAME = "LastName";
     
    	private static final String CREATE_BDD = "CREATE TABLE " + TABLE_RESERVATION + " ("
    	+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_REFERENCE + " TEXT NOT NULL, "
    	+ COL_LASTNAME + " TEXT NOT NULL);";
     
    	public MaBaseSQLite(Context context, String name, CursorFactory factory, int version) {
    		super(context, name, factory, version);
    	}
     
    	@Override
    	public void onCreate(SQLiteDatabase db) {
    		//on crée la table à partir de la requête écrite dans la variable CREATE_BDD
    		db.execSQL(CREATE_BDD);
    	}
     
    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    		//On peut faire ce qu'on veut ici moi j'ai décidé de supprimer la table et de la recréer
    		//comme ça lorsque je change la version les id repartent de 0
    		db.execSQL("DROP TABLE " + TABLE_RESERVATION + ";");
    		onCreate(db);
    	}
     
    	public static String getColReference() {
    		return COL_REFERENCE;
    	}
     
    	public static String getColLastname() {
    		return COL_LASTNAME;
    	}
     
    }
    [...]
    MainActivity.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [...]
    //Initialiser la base de données
            final ReservationsBDD rdb = new ReservationsBDD(this);
            rdb.open();
     
            CheckTrip.setOnClickListener(new View.OnClickListener()	{
        		public void onClick(View v) {
        			//Écrire la réservation dans la base si elle n'y est pas déjà
        			rdb.insertReservation(new Reservation(ReservationReference.getText().toString(), LastName.getText().toString(), 1));
        		}
        	});
     
            FlightBook.setOnClickListener(new View.OnClickListener()	{
        		public void onClick(View v) {
        			//Afficher l'activité adéquate
        			Intent myIntent = new Intent(v.getContext(), FlightBook.class);
                    startActivityForResult(myIntent, 0);
        		}
        	});
    [...]
    FlightBook.java (mon activité secondaire)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    public class FlightBook extends Activity {
     
    	private ListView ReservationList = null;
     
        @SuppressWarnings("deprecation")
    	@Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_flight_book);
     
            ReservationList = (ListView) findViewById(R.id.flightList);
     
          //Initialiser la base de données
            final ReservationsBDD rdb = new ReservationsBDD(this);
            rdb.open();
     
            Cursor c = rdb.queueAll();
            startManagingCursor(c);
     
            String[] from = new String[]{MaBaseSQLite.getColReference(), MaBaseSQLite.getColLastname()};
            int[] to = new int[]{R.id.reference_entry, R.id.lastname_entry};
     
     
            /* Display the bdd */
            SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this.getBaseContext(), R.layout.activity_flight_book, c, from, to);
            ReservationList.setAdapter(mAdapter);
     
            rdb.close();
    }
    [...]
    J'ai juste un énorme doute sur ces casse-têtes que sont les layouts en paramètre, et je n'ai pas été foutu trouver le moyen de les schunter! En fait qu'est-ce je dois mettre comme layouts pour from et to, je n'ai jamais compris, sachant que mon activité FlightBook a son propre layout, mais pas la ListView qu'il y a dedans, et encore moins les champs texte de cette ListView...

    Du coup comment faire?
    Merci d'avance.

    PS: Je me suis permis de continuer sur le même topic pour ne pas avoir à "l'abandonner" vu que je n'ai pas poursuivi dans la même voie que celle initiale.

    ====== EDIT ======

    Voici mes fichiers layout XML

    activity_flight_book.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
     
        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
     
            <TextView
                android:id="@+id/flightBookBlueBanner"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:background="@color/lightblue"
                android:gravity="center"
                android:text="@string/flight_book"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:textColor="@color/white" />
        </LinearLayout>
     
        <ListView
            android:id="@+id/flightList"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:layout_below="@+id/linearLayout1" >
     
        </ListView>
     
    </RelativeLayout>
    activity_main.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="bottom"
        android:gravity="center_horizontal" >
     
        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
     
            <TextView
                android:id="@+id/blueBannerMain"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:background="@color/lightblue"
                android:gravity="center"
                android:padding="@dimen/padding_check_my_trip"
                android:text="@string/check_my_trip"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:textColor="@color/white" />
     
            <EditText
                android:id="@+id/ReservationReference"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginTop="@dimen/padding_40_px"
                android:ems="10"
                android:hint="Reservation Reference"
                android:clickable="true" />
     
            <EditText
                android:id="@+id/LastName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_marginTop="19dp"
                android:ems="10"
                android:hint="@string/last_name"
                android:clickable="true" />
     
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/padding_40_px" >
     
                <Button
                    android:id="@+id/CheckMyTrip"
                    android:layout_width="159dp"
                    android:layout_height="wrap_content"
                    android:layout_gravity="left"
                    android:layout_marginTop="@dimen/padding_40_px"
                    android:paddingTop="@dimen/padding_check_my_trip"
                    android:text="@string/check_my_trip" />
     
                <Button
                    android:id="@+id/FlightBook"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="right"
                    android:text="Flight Book" />
     
            </LinearLayout>
     
            <ImageView
    	android:layout_width="fill_parent" 
    	android:layout_height="wrap_content"
    	android:layout_gravity="center" 
    	android:src="@drawable/belAvion" />
     
        </LinearLayout>
     
    </RelativeLayout>
    list_example_entry (tirée d'ici: http://thinkandroid.wordpress.com/20...and-listviews/ mais pas compris pourquoi faire...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >
    	<TextView
    		android:id="@+id/reference_entry"
    		android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:textSize="28dip" />
           <TextView
    		android:id="@+id/lastname_entry"
    		android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:textSize="28dip" />
    </LinearLayout>

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Ca a l'air nickel....

    Juste une ou deux remarques, sur les constantes des MaBaseSQLite et des ReservationsBDD...

    J'ai fait la même remarque pas plus tard qu'hier sur un autre post (même tuturial ?), il ne sert à rien de déclarer des constantes si c'est pour les redéclarer ailleurs....

    D'autre-part il faut structurer les relations entre objets, je m'explique:
    ReservationsBDD (on appelle cette classe un DataAccessObject, ou DAO, BDD = BaseDeDonnée en général, ce qui n'est pas le cas ici), doit être la seule classe à connaitre:
    * Le nom de la table utilisée
    * Les colonnes utilisées
    * La "traduction"
    Pour ce faire elle n'a besoin à la construction que d'un simple pointeur sur une base SQLite...

    donc un truc genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    public class ReservationsDAO
    {
          public static TABLE = "RESERVATIONS";
     
          public static enum Columns {
              ID,
              REFERENCE,
              LASTNAME
          }
     
          // Attention la fonction suivante est à fournir dans une classe utilitaire (voir le code ci dessous)
          private static String[] COLUMNS = EnumUtils.enumArrayToStringArray(Columns.values());
     
     
          private SQLiteDatabaes   database;
     
          public ReservationsDAO(SQLiteDatabase db) { this.database = db; }
     
          public ReservationsDAO(SQLiteOpenHelper helper) { this.database = helper.getWritableDatabase(); }
     
     
          public Cursor getAllCursor()
          {
               return  this.database.query(TABLE, COLUMNS , null, null, null, null, null);
          }
     
          public List<Reservation> listAll()
          {
               ArrayList<Reservation> ret = new ArrayList<Reservation>();
               Cursor c = getAllCursor();
               try {
                   boolean hasMore = c.moveToFirst();
                   while (hasMore) {
                       ret.add(read(c));
                       hasMore = c.moveToNext();
                   }
               } finally {
                   c.close();
               }
               return ret;
          }
     
          private Reservation read(Cursor c)
          {
              Reservation ret = new Reservation();
              ret.setId(c.getLong(Columns.ID.ordinal()));
              ret.setReservation(c.getString(Columns.ID.ordinal()));
              ret.setLastName(c.getString(Columns.ID.ordinal()));
              return ret;
          }
     
     
     
          private static final String CREATE_SQL = "CREATE TABLE " +
                  TABLE + " (" +
                       Columns.ID.name() + " INTEGER PRIMARY KEY AUTOINCREMENT,"+
                       Columns.REFERENCE.name()+" TEXT NOT NULL,"+
                       Columns.LASTNAME.name()+" TEXT NOR NULL"+
                  ");";
     
          void createTable()
          {
               this.database.execSQL(CREATE_SQL);
          }
     
          void updateTable(int oldVersion, int newVersion)
          {
               this.database.execSQL("DROP TABLE "+TABLE);
               createTable();
          }
    }
    Le code de la classe "EnumUtils":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class EnumUtils
    {
         public <T extends Enum<T>> String[] enumArrayToStringArray(T[] values)
         {
              String[] ret = new String[values.length];
              for (int i = 0; (i < values.length); ++i) 
                  ret[i] = values[i].name();
              return ret;
         }
     
         private EnumUtils() { /* disabled... utility static methods class */ }
    }
    Voilà... déjà rajouter une colonne demande à uniquement changer l'enum
    pour les index de colonne... c'est facile: Columns.XXXX.ordinal()
    Pas moyen de se tromper, impossible de mettre deux fois la même colonne, tout est automatique, et géré partout... ou presque (il faudra faire attention au create-table bien sur).

    Ensuite, il y a la base de données... Elle sait qu'elle va contenir des Reservations, mais se fiche de savoir leur tronche... par contre elle-seule connait le "vrai" nom de la base et bim:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    public class MaBaseSQLite extends SQLiteOpenHelper {
     
        static final String DATABASE_NAME = "Madatabase.db";
        static final int DATABASE_VERSION = 2;
     
        public MaBaseSQLite(Context context, CursorFactory factory)
        {
             super(context, DATABASE_NAME, factory, DATABASE_VERSION);
        }
     
        @Override
        public void onCreate(SQLiteDatabase db) {
               // et voila ... ca c'est c'est fait
               (new ReservationsDAO(db)).createTable();
        }
     
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            //comme ça lorsque je change la version les id repartent de 0
            (new ReservationsDAO(db)).updateTable(oldVersion,newVersion);
        }
    }
    Ensuite dans le MainActivity, ben c'est le seul bout de code qui va coller les truc dans la ListView...
    Rien d'INFERNAL ^^

    Il a l'air correct.... sauf qu'il est recommandé de passer par des loaders !!
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Merci pour vos réponses encore une fois.
    En fait, je viens de m'apercevoir que j'ai oublié de dire le plus important: tout a l'air de fonctionner (je n'ai pas encore vérifié si les enregistrements se font dans la base) sauf que quand j'appelle l'activité FlightBook, l'app se plante. Voici le logcat (si je ne me trompe):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    11-18 13:43:45.350: E/AndroidRuntime(1493): FATAL EXCEPTION: main
    11-18 13:43:45.350: E/AndroidRuntime(1493): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mon.app/com.example.mon.app.FlightBook}: java.lang.IllegalArgumentException: column '_id' does not exist
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2190)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2215)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at android.app.ActivityThread.access$600(ActivityThread.java:145)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1211)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at android.os.Looper.loop(Looper.java:137)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at android.app.ActivityThread.main(ActivityThread.java:4978)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at java.lang.reflect.Method.invokeNative(Native Method)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at java.lang.reflect.Method.invoke(Method.java:511)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at dalvik.system.NativeStart.main(Native Method)
    11-18 13:43:45.350: E/AndroidRuntime(1493): Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:302)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at android.support.v4.widget.CursorAdapter.init(CursorAdapter.java:174)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at android.support.v4.widget.CursorAdapter.<init>(CursorAdapter.java:122)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at android.support.v4.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:54)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at android.support.v4.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:63)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at com.example.mon.app.FlightBook.onCreate(FlightBook.java:41)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at android.app.Activity.performCreate(Activity.java:5008)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
    11-18 13:43:45.350: E/AndroidRuntime(1493): 	... 11 more
    D'après ce que je comprends, il me dit que la colonne _id n'existe pas. Pourtant, à aucun moment dans le code que je vous donne je ne fais appel à une colonne de ce nom (avec l'underscore)... :/

    Il me semble avoir vu un topic sur ce forum avec une personne ayant le même problème, mais je ne le retrouve pas.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Finalement j'ai résolu mon problème en faisant ça:

    - Renommer ma colonne ID en _id dans toutes les classes

    - Ajouté COL_ID dans ma requête du curseur qui récupère toute la base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] column = new String[]{COL_ID, COL_REFERENCE, COL_LASTNAME};
    Mais j'apprécie moyennement cette solution. Pourquoi Android veut m'obliger à appeler la colonne _id et récupérer l'ID dans le curseur alors qu'il ne va pas m'être forcément utile?

    === EDIT ===

    Ca y est, j'ai réussi à faire ce que je veux. Avec les mêmes fichiers XML que précédemment, il faut juste changer ça dans la classe FlightBook.java:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String[] from = new String[]{MaBaseSQLite.getColReference(), MaBaseSQLite.getColLastname()};
            int[] to = new int[]{R.id.reference_entry, R.id.lastname_entry};
     
     
            /* Display the bdd */
            SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this.getBaseContext(), R.layout.list_example_entry, c, from, to);
            ReservationList.setAdapter(mAdapter);
    Voilà, même si le code n'est pas tout à fait optimisé (StartManagingCursor deprecated, les constantes en double comme un des membres l'a dit ci-dessus...etc.), j'espère que ça dépannera ceux qui pataugent à mort dans ce domaine comme je l'ai fait.

    Merci à tous, pour votre aide qui m'a été précieuse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer des valeurs d'un objet sans passer par les boucles
    Par soucou dans le forum Calcul scientifique
    Réponses: 4
    Dernier message: 02/03/2013, 16h05
  2. Réponses: 8
    Dernier message: 03/06/2012, 19h12
  3. Acceder à une page ASP.NET sans passer par la case Login
    Par ehochedez dans le forum ASP.NET
    Réponses: 8
    Dernier message: 07/10/2010, 10h28
  4. update une ligne de gridview sans passer par edit
    Par pseudo88 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 16/03/2009, 12h52
  5. Réponses: 5
    Dernier message: 24/08/2007, 15h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo