2010-11-10 3 views
1

Je tente de créer une méthode qui me permettra d'extraire une valeur de la dernière ligne d'une base de données, puis de l'insérer dans un Champ EditText (Ceci est une valeur que l'utilisateur ne changera pas si souvent, il serait donc utile que quand il le fait, il reste actif quand il reviendra dessus).Récupération d'une seule colonne de la dernière ligne dans sqlite/Android en utilisant ORDER ID desc limite 1

Ma méthode, basée sur une méthode similaire je pour obtenir le total d'une colonne spécifique, est en tant que telle:

public String getBase() { 
Cursor mCursor = mDb.rawQuery(
    "SELECT base FROM table constants ORDER ID desc limit 1", null); 
if (mCursor.moveToFirst()) { 
    return mCursor.getString(0); 
} 
return mCursor.getString(0); 

Comme je l'ai dit, je me suis basé cela sur une méthode similaire, que j'ai trouvé après chercher sur Internet. Je comprends la plupart, mais je n'ai aucune idée de ce que signifient les 0 dans les instructions de retour (ou la méthode moveToFirst).

Quoi qu'il en soit, dans mon OnClickListener (le bouton l'utilisateur presserait pour enregistrer cette valeur db), je donne les résultats suivants (editBase est le champ EditText Je veux remplir):

editBase.setText(cDbHelper.getBase()); 

Si je cours le programme sans cette déclaration, il fonctionne très bien et la valeur économise à la DB. Dès que j'essaie de le faire fonctionner, j'ai une force proche. Aucune suggestion?

Merci.

EDIT: Merci pour les réponses. Avec quelques conseils d'un ami, j'ai fini par utiliser "ORDER BY ... desc limite 1" à la place. Ce fut la dernière méthode:

public double getBase() { 
    final double DEFAULT_BASE = 0; 
    Cursor mCursor = mDb.rawQuery(
      "SELECT base FROM constants ORDER BY _id desc limit 1", null); 
    if (mCursor.getCount() == 0) 
     return DEFAULT_BASE; 
    else 
     mCursor.moveToFirst(); 
     return mCursor.getDouble(0); 
+0

Quel est votre message d'erreur? Quelle éclipse (ou adb) a dit quand il se bloque? – ykatchou

Répondre

0

1) Pour interroger le DB peut être essayer celui-ci:

https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

SQLiteDatabase a méthode query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit).

Au moins avec celui-ci, vous n'avez pas besoin de construire votre SQL manuellement.

2) Vérifiez la doc pour le curseur: http://developer.android.com/reference/android/database/Cursor.html#getString(int)

0 est un columnIndex.

0

Vous essayez probablement de mettre à jour une vue lorsque vous exécutez un travail sur un thread séparé, cela déclenche presque toujours une fermeture de force.

Dans cet article, Painless Threading, vous apprenez comment transformer votre travail de longue haleine en un autre fil (et comment vous pouvez y revenir). Fondamentalement, vous pouvez indiquer au thread graphique (ou à la file d'attente d'événements ou au thread d'interface utilisateur) que vous avez besoin d'un Runnable pour exécuter l'accès à vos contrôles et vues.

private void clicked() { 
    // called from a click of a button for instance 
    new Thread(new Runnable() { 
     public void run() { 
      // the long running job should be executed on a different 
      // thread as to not stall the ui thread 
      runLongWork(); 
     } 
    } 
} 

private void runLongWork() { 
    // this is method running on separate thread 
    // so we should run a runnable on the ui thread instead to update our view's. 
    this.runOnUiThread(new Runnable() { 
     public void run() { 
      // Now we are back in the ui thread 
      editBase.setText(cDbHelper.getBase()); 
     } 
    } 
} 

Comme pour les autres questions Arhimed déjà répondu en partie. Lorsque vous exécutez une requête sur la base de données Sqlite, vous obtenez une instance d'une classe Cursor qui est une sorte de liste des résultats ou des lignes que votre requête a récupérées. En utilisant la méthode moveToFirst, vous positionnez le curseur sur la première ligne de résultats. Vous pouvez ensuite obtenir les valeurs des colonnes de votre requête en utilisant les méthodes getXYZ() (par exemple getString()) et transmettre un index de la colonne que vous souhaitez. 0 dans ce cas fait référence à base, la première colonne de votre requête SQL.Si vous avez plus d'une ligne, vous pouvez utiliser la méthode moveToNext pour obtenir la ligne suivante, et comme elle renvoie un bool qui indique qu'elle a "trouvé" une ligne suivante, vous pouvez l'utiliser dans une boucle while pour obtenir toutes vos rangées.

while (cursor.moveToNext()) { 
    // next row of data, use getString, getInt or others 
} 

Votre barbante de requête renverra toujours une seule valeur, puisque vous limitez les résultats à 1, donc pas besoin d'utiliser le moveToNext. moveToFirst, comme moveToNext, renvoie true si une ligne a été trouvée et false s'il n'y a plus de lignes disponibles.

Votre déclaration est la suivante; vous exécutez une requête, passez à la première ligne et, si elle a réussi, renvoyez la chaîne de la première colonne de la requête (l'index commence à zéro). Si ne trouve pas trouve une ligne, vous retournez la première colonne comme une chaîne, qui échouera probablement si. Vous devriez peut-être retourner une valeur par défaut ou lancer une exception dans ce cas.

Questions connexes