Jump to content

Recommended Posts

Bonjour à tous,

Voila j'aimerai afficher dans un formulaire une liste déroulante avec les données d'une table de ma base de donnée, mais malheureusement je n'arrive pas et j'ai beaucoup d'erreurs:

cette table pointe vers une autre nommé "type" pour pouvoir donnée des choix du type :

Pour récupérer les éléments de ma table "type" je fais un Cursor (dans ma classe DBAdater):

public Cursor type(){

	Cursor Curseur = bd.query("type", new String[]{
	"_id",
	"type"}, 
	null,
	null, 
	null, 
	null, 
	null);
	Curseur.moveToFirst();

	return Curseur;
}

Et dans ma classe ajouter dans laquelle je réalise mon formulaire j'ajoute ce code dans le onCreate(Bundle savedInstanceState):

Cursor C = bd_transfert.liste_type();
	int id = C.getColumnIndexOrThrow("type");

	final Spinner s = (Spinner) findViewById(R.id.Spinner_type_local);
	ArrayAdapter<String> adapterForSpinner;
	adapterForSpinner = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
	adapterForSpinner.setDropDownViewResource(android.R.layout.simple_spinner_item);

	s.setAdapter(adapterForSpinner);

Et j'ai beaucoup d'erreurs dans mon LogCat:

01-10 17:31:04.917: ERROR/Database(5936): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
01-10 17:31:04.917: ERROR/Database(5936):     at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
01-10 17:31:04.917: ERROR/Database(5936):     at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:55)
01-10 17:31:04.917: ERROR/Database(5936):     at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1549)
01-10 17:31:04.917: ERROR/Database(5936):     at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410)
01-10 17:31:04.917: ERROR/Database(5936):     at com.projet.projet.DBAdapter.inserer_local(DBAdapter.java:154)
01-10 17:31:04.917: ERROR/Database(5936):     at com.projet.projet.Ajouter_local$1.onClick(Ajouter_local.java:88)
01-10 17:31:04.917: ERROR/Database(5936):     at android.view.View.performClick(View.java:2408)
01-10 17:31:04.917: ERROR/Database(5936):     at android.view.View.onKeyUp(View.java:4121)
01-10 17:31:04.917: ERROR/Database(5936):     at android.widget.TextView.onKeyUp(TextView.java:4431)
01-10 17:31:04.917: ERROR/Database(5936):     at android.view.KeyEvent.dispatch(KeyEvent.java:1061)
01-10 17:31:04.917: ERROR/Database(5936):     at android.view.View.dispatchKeyEvent(View.java:3740)
01-10 17:31:04.917: ERROR/Database(5936):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:788)
01-10 17:31:04.917: ERROR/Database(5936):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:788)
01-10 17:31:04.917: ERROR/Database(5936):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:788)
01-10 17:31:04.917: ERROR/Database(5936):     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:788)
01-10 17:31:04.917: ERROR/Database(5936):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1667)
01-10 17:31:04.917: ERROR/Database(5936):     at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1102)
01-10 17:31:04.917: ERROR/Database(5936):     at android.app.Activity.dispatchKeyEvent(Activity.java:2063)
01-10 17:31:04.917: ERROR/Database(5936):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1643)
01-10 17:31:04.917: ERROR/Database(5936):     at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2471)
01-10 17:31:04.917: ERROR/Database(5936):     at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2441)
01-10 17:31:04.917: ERROR/Database(5936):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1735)
01-10 17:31:04.917: ERROR/Database(5936):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-10 17:31:04.917: ERROR/Database(5936):     at android.os.Looper.loop(Looper.java:123)
01-10 17:31:04.917: ERROR/Database(5936):     at android.app.ActivityThread.main(ActivityThread.java:4627)
01-10 17:31:04.917: ERROR/Database(5936):     at java.lang.reflect.Method.invokeNative(Native Method)
01-10 17:31:04.917: ERROR/Database(5936):     at java.lang.reflect.Method.invoke(Method.java:521)
01-10 17:31:04.917: ERROR/Database(5936):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-10 17:31:04.917: ERROR/Database(5936):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-10 17:31:04.917: ERROR/Database(5936):     at dalvik.system.NativeStart.main(Native Method)

Merci d'avance.

Edited by nathalie85

Share this post


Link to post
Share on other sites

Le logcat indique que tu as une contrainte d'intégrité qui n'est pas respectée lors de l'insertion d'un élément dans la table local. Au vu de ton schéma de table, il doit s'agir soit de la colonne id_entreprise, soit de id_type, qui n'est pas renseignée avec une valeur correcte correspondant à un id de la table entreprise (ou type)

Share this post


Link to post
Share on other sites

Merci chpil d'avoir pris le temps de répondre.

Je vais revoir mes tables et je te tiens informé.

Edited by nathalie85

Share this post


Link to post
Share on other sites

(cette réponse fait suite à ce post et cet autre qui concernent tous les deux le même point; la scission en deux posts était inutile, et risque de nuire à la compréhension pour les futurs lecteurs)

Il faut que tu passes les bonnes données à ton spinner; tu peux pour cela utiliser un SimpleCursorAdapter. Ensuite, sur le spinner, lors de la validation du formulaire, tu seras capable de récupérer l'id de l'élément sélectionné, et de le passer ensuite à la base pour insertion

Dans le onCreate

   Cursor cursor = bd_transfert.liste_type();
   int id = C.getColumnIndexOrThrow("type");

   final Spinner spinnerLocal = (Spinner) findViewById(R.id.Spinner_type_local);
   SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, cursor, new String[]{ "type"}, new int[]{ android.R.id.text1});
   adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

   spinnerLocal.setAdapter(adapter);

   findViewById(R.id.Btn_valider).setOnClickListener( // le bouton pour valider la saisie
       new Button.OnClickListener()
                {
                    public void onClick(View v) {

                        String num_local = Txtnumlocal.getText().toString();
                        String taille_local = Txttaillelocal.getText().toString();
                        String batiment = Txtbatiment.getText().toString();
                        String etage = Txtetage.getText().toString();
                        String aile = Txtaile.getText().toString();

                        long id_local = spinnerLocal.getSelectedItemId();
                        if (id_local == AdapterView.INVALID_ROW_ID)
                        {
                            // Gérer le cas d'erreur où aucune sélection n'a été faite dans le spinner
                            ...
                        }
                        else
                        {
                            bd_transfert.inserer_local(num_local,taille_local,batiment,etage,aile,id_local);

                            //Afficher l'accueil
                            Intent intent = new Intent(Ajouter_local.this,Local.class);
                            Ajouter_local.this.startActivity(intent);
                        }
                   }
               }
           );
       }

Share this post


Link to post
Share on other sites

Merci beaucoup chpil pour ton aide précieuse, j'ai essayé ce que tu m'as expliqué et ça marche. Merci encore.

Edited by nathalie85

Share this post


Link to post
Share on other sites

Je profite pour te poser une autre question chpil, elle concerne les bases de données aussi donc je peux continuer dans ce post.

Ma table Local possède une autre clé étrangère nommée id_entreprise qui fait référence à la table entreprise.

pour récupérer ce champs j'ai fait un Cursor dans ma table DBAdapter:

	public Cursor recupereridentreprise(){
	return bd_transfert.query("entreprise", new String[]{
			"_id",
			"_id"
			},null, null, null, null, null);
}

Et pour récupérer le champs id_entreprise dans ma classe ajouter_local je fais :

Cursor c = bd_transfert.recupereridentreprise();
int id_entreprise = c.getColumnIndexOrThrow("_id");

Ensuite je l'insérer dans la table avec les autres champs:

 bd_transfert.inserer_local(num_local,taille_local,batiment,etage,aile,id_type, id_entreprise);

Le soucis c'est que dans ma table local, le id_entreprise est toujours égal à 1 même si il est égal à 2 ou 3 dans la table entreprise.

pourtant le id_entreprise dans la table entreprise est un integer primary key autoincrement donc il change d'une entreprise à une autre. Et vu qu'il n'y a pas d'erreur dans le logcat je ne sais pas du tout c'est quoi le problème.

Merci beaucoup d'avance.

Edited by nathalie85

Share this post


Link to post
Share on other sites

Le comportement que tu obtiens est logique. Nulle part tu ne fais de sélection de l'entreprise dont tu veux l'id:

- tu fais une requête pour récupérer la liste des entreprises (la méthode recupereridentreprise)

- tu récupères l'id de la première entreprise (le cursor est positionné par défaut sur le premier résultat de la requête)

- tu insères cet id dans ta base

=> tu références à chaque fois la même entreprise

Il te manque un critère de sélection de ton entreprise

Share this post


Link to post
Share on other sites

Bonjour chpil, merci encore une fois d'avoir répondu,

Qu'est ce que tu veux dire par un autre critère de sélection, est ce que par exemple je dois récupérer le nom de l'entreprise aussi ??

(désolée je suis vraiment débutante!!)

Share this post


Link to post
Share on other sites

Ce que je veux dire, c'est quel est le critère de sélection de l'entreprise que tu veux référencer (via son id) dans la table local ? Tu as plusieurs entreprises dans la table entreprise, il faut bien que tu précises celle que tu sélectionnes. C'est une question purement fonctionnelle, pas technique. Seule toi a la réponse.

Share this post


Link to post
Share on other sites

En fait moi j'ai une listeview avec les entreprises que j'ai en base de donnée, en cliquant sur l'entreprise je peux créer un nouveau local ou retrouver les locaux qui appartiennent à cette entreprise.Donc je pense que le critère est la sélection dans ma listeview, qu'est que tu en penses??

Share this post


Link to post
Share on other sites

Lorsque tu sélectionnes ton entreprise (dans l'Activity précédente je présume), il faut que tu récupères l'id de ladite entreprise, pour la passer en paramètre à l'Activity de saisie d'un local (utilise putExtra/getLongExtra sur la classe Intent pour ce faire). Pas besoin de réaccéder à la base de données pour récupérer les informations sur l'entreprise lors de l'enregistrement du local

Share this post


Link to post
Share on other sites

J'ai essayé ce que tu m'as dit mais ça ne marche pas.

Si j'ai bien compris dans ma classe Ajouter_entreprise j'ai récupéré l'id en utilisant le cursor et j'ai utilisé le putExtra

Et dans ma classe Ajouter_local j'ai ajouté un intent avant l'insertion des données dans la base de donnée:

Dans ma table il donne à l'id la valeur du long défault value à chaque fois.

Edited by nathalie85

Share this post


Link to post
Share on other sites

Ouh là, tu mélanges tout là...

J'ai l'impression qu'il te manque un certain nombre de notions de base de la conception d'appli pour Android. Tu devrais te pencher sur quelques tutoriaux, lire un bon bouquin (cherche dans le forum ou sur le wiki Frandroid, il y a quelques références)

Pour répondre quand même à ta question, un Intent peut servir à décrire l'Activity que l'on souhaite appeler, lui passer des paramètres, ... Cet Intent 'voyage' entre l'Acitivty appelante et l'Activity appelée.

Dans ton code, tu appelles putExtra après avoir appelé startActivity, ce qui ne sert à rien, l'Activity ayant été déjà appelée.

Et dans ajouter_local, il ne faut pas créer un nouvel Intent, mais récupérer celui qui a servi à appeler l'Activity (via getIntent)

Dans Ajouter_entreprise

   long id_entreprise = bd_transfert.inserer_entreprise(nom_entreprise,......);  // inserer_entreprise doit retourner l'id de l'entreprise nouvellement créée
   Intent intent = new Intent(Ajouter_Entreprise.this,Main.class);
   intent.putExtra("id_entreprise", id_entreprise);
   Ajouter_Entreprise.this.startActivity(intent);

et dans Ajouter_local, dans le onCreate

    id_entreprise = getIntent().getLongExtra("id_entreprise");  // id_entreprise est un attribut de Ajouter_local, pour pouvoir le référencer ensuite lors de l'insertion du local

Share this post


Link to post
Share on other sites

j'ai essayé ce que tu m'as expliqué ça n'a rien changé l'id est toujours à 1, sauf que la à chaque fois que je crée une entreprise il me la crée en double dans la base de donnée.

Share this post


Link to post
Share on other sites

Si tu as une insertion en double en base, c'est un autre problème, c'est que tu dois appeler en double l'insertion.

Pour ce qui est de récupérer la bonne valeur d'id de l'entreprise, as-tu vérifié (au debugger / avec des logs) ce que te retournait bd_transfert.inserer_entreprise ? ce que tu passais à l'Intent ? ce que tu récupérais sur l'Intent dans Ajouter_local.onCreate ?

Share this post


Link to post
Share on other sites

Salut

je reviens vers toi dans la bonne discussion cette fois.

Si j'ai bien compris sur le même écran tu as

1°) le spiner qui indique les articles

2°) une table déroulante qui montre les articles sélectionnés de la base de données.

Share this post


Link to post
Share on other sites

Spinner est une liste déroulante, dans mon cas elle montre les champs d'une table de ma base de données.

Edited by nathalie85

Share this post


Link to post
Share on other sites

Bonjour a tous,

j'ai une question concernant les spinners si c'est possible de me répondre!!

voila, je suis debutante en développement et je travaille sur une application android

je vais expliquer plus en détails mon cas:

j'ai deux tables en base de donnée, client et secteur

la table client (code client, nom, adresse, telephone, email, secteur) >> le champ "secteur" dans cette table est le foreign key de (code secteur) dans la table secteur.

la table secteur(code secteur, designation secteur)

mon anterface graphique est une fiche client qui permet d'ajouter, supprimer, modifier, récupérer un client grace a son id, afficher la liste des clients.

dans ma fiche: le code client, nom, adresse, tel, email sont des editText, et le secteur est un spinner où je récupére tous les secteur de la table secteur (les designations).

mon souci est que quand je veux consulter les données d'un client a l'aide de son "code" , je récupére toutes ses données dans les editText mais dans le spinner, je ne sais pa comment faire pour qu'il me récupére la designation secteur correspondante. merci

 

Edited by souadkhel

Share this post


Link to post
Share on other sites
 

bonjour, je souhaite recuperer une donnée que j'ai inserer dans la base de donnée  partir d'un spinner je fais comment??

aidez moi svp

 
 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  





×
×
  • Create New...