Aller au contenu

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.

Modifié par nathalie85
Lien vers le commentaire
Partager sur d’autres 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)

Lien vers le commentaire
Partager sur d’autres 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);
                        }
                   }
               }
           );
       }

Lien vers le commentaire
Partager sur d’autres 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.

Modifié par nathalie85
Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres 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??

Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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.

Modifié par nathalie85
Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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 ?

Lien vers le commentaire
Partager sur d’autres 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

 

Modifié par souadkhel
Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...