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
Link to comment
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)

Link to comment
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);
                        }
                   }
               }
           );
       }

Link to comment
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
Link to comment
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

Link to comment
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.

Link to comment
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??

Link to comment
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

Link to comment
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
Link to comment
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

Link to comment
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 ?

Link to comment
Share on other sites

  • 2 weeks later...
  • 4 years later...

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
Link to comment
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
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
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.

×
×
  • Create New...