2010-11-21 22 views
3

Je pense que le scénario suivant est commun, mais je ne peux pas comprendre la façon de la mettre en œuvre:partage curseur entre Activités

Nous avons trois activités, et une base de données. Nous demandons à l'utilisateur une entrée pour effectuer une recherche dans la base de données. La requête ne doit pas avoir de résultat, un ou peut entraîner des résultats.

  • Si vous n'en avez pas, vous en informez simplement l'utilisateur.
  • Si vous n'en obtenez qu'un seul, vous le montrez dans une nouvelle activité avec la bonne vue.
  • Si vous en obtenez plusieurs, vous les affichez dans une liste pour laisser l'utilisateur choisir la bonne, puis vous passez à l'activité qui affiche les données dans le cas d'un seul résultat.

Le problème est que, pour connaître le nombre de résultats, vous devez faire la requête (et obtenir le curseur) dans la première activité. Et dans le cas où vous obtenez plus d'un résultat, vous devez envoyer les données (passer le curseur?) à la liste acitivty. Faire à nouveau la requête dans l'activité de liste ne peut pas être correct, non? Je suis conscient que vous pouvez partager des curseurs en utilisant un fournisseur de contenu, mais comme les activités proviennent de la même application et que les données sont privées (inutiles à l'extérieur), ne voyez pas l'intérêt de les rendre accessibles à quiconque autre.

Je lis ici que vous pouvez créer un curseur parcelable et l'envoyer en paquet, mais je ne suis pas sûr que ce soit le bon usage.

Une idée sur la façon de résoudre ce problème?

Merci d'avance.

Répondre

3

Option 1: La requête effectuée par l'activité de recherche est juste SELECT _ID FROM ... Dans le cas "none", le message est affiché. Dans le cas "un", il passe le _ID correspondant à l'activité de détail pour voir la correspondance en demandant d'obtenir toutes les colonnes nécessaires pour cette rangée. Dans le cas "multiple", il transmet les termes de recherche à l'activité de liste, qui exécute la requête complète (y compris toutes les colonnes nécessaires pour afficher la liste).

Option 2: Fusionnez l'activité de recherche et l'activité de liste en une seule activité. Fondamentalement, pensez à "rechercher et choisir un élément à afficher" comme étant une "transaction d'interface utilisateur" et à le faire dans une seule activité. L'activité de recherche ferait une requête suffisante pour remplir la liste dans le cas "multiple", affichant la liste dans un AlertDialog ou dans l'activité principale elle-même via un ViewFlipper ou quelque chose comme ça. Dans le cas "none", il affiche le message. Dans le cas «un» - ou lorsque l'utilisateur appuie sur une entrée de la liste - il transmet des informations à l'activité de détail pour afficher l'élément.

Option 3: Déplacez votre requête de recherche vers l'activité de la liste - votre activité de recherche transmet l'information de recherche à l'activité de la liste par extras, ce qui fait le rawQuery() en onCreate(). L'activité de liste gère les cas "none" et "many". Dans le cas du "un", il appelle simplement startActivity() sur l'activité de détail et finish() pour que le contrôle retourne à l'activité de recherche lorsque l'utilisateur appuie sur RETOUR.

Toutes choses égales par ailleurs, j'irais probablement avec l'option # 2.

+0

Je suis allé pour la 3ème option parce que je ne savais pas sur le ViewFlipper (je suis toujours un noob). Je suis d'accord avec vous, la deuxième option est ce qui me semble le mieux. Je vais essayer. Merci – Asincrono

+0

@CommonsWare Op # 2 est une sorte de ce que j'ai implémenté.Je me demandais si vous pouviez passer le curseur au lieu de la substance? J'ai lu que vous pourriez créer une application (myApp extends Application) comme fait ici: http://stackoverflow.com/a/8456148/317889 et enregistrer le curseur pour une utilisation dans toutes les activités, cela serait-il sain d'esprit? – HGPB