J'essaie d'interroger toutes les colonnes d'une table dans une vue de texte longue et/ou une chaîne. Je sais que ce n'est peut-être pas la bonne façon de faire les choses, mais je dois le faire. Corrigez-moi si je me trompe, j'avais l'impression que déplacer ensuite la colonne suivante de la rangée:
Cursor c = db.get();
if(c.moveToFirst){
do{
string = c.getString(0);
}while(c.moveToNext);
Je pensais que cela obtiendrait la première colonne et afficherait tout son contenu, à la place de la première colonne et de la première ligne. Qu'est-ce que je fais mal? Existe-t-il un moyen meilleur ou réel d'obtenir cette information sans utiliser ListView?
Pour plus de clarté, voici un exemple complet qui, je l’espère, présente un intérêt. Comme indiqué dans les commentaires de code, nous parcourons essentiellement les lignes de la base de données, puis les colonnes, pour former un tableau de données correspondant à la base de données.
Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null,
null);
//if the cursor isnt null we will essentially iterate over rows and then columns
//to form a table of data as per database.
if (cursor != null) {
//more to the first row
cursor.moveToFirst();
//iterate over rows
for (int i = 0; i < cursor.getCount(); i++) {
//iterate over the columns
for(int j = 0; j < cursor.getColumnNames().length; j++){
//append the column value to the string builder and delimit by a pipe symbol
stringBuilder.append(cursor.getString(j) + "|");
}
//add a new line carriage return
stringBuilder.append("\n");
//move to the next row
cursor.moveToNext();
}
//close the cursor
cursor.close();
}
L'utilisation simple est:
Cursor cursor = db.query(...);
while (cursor.moveToNext()) {
...
}
moveToFirst est utilisé lorsque vous devez commencer à itérer une fois que vous avez atteint une position.
Évitez d’utiliser cursor.getCount () sauf si cela est requis. Et n'utilisez jamais de boucle sur getCount ().
getCount est cher - il faut parcourir plusieurs enregistrements pour les compter. Il ne retourne pas une variable stockée. Il peut y avoir une mise en cache sur un second appel, mais le premier appel ne connaît pas la réponse tant qu’elle n’a pas été comptée.
Si votre requête correspond à 1000 lignes, le curseur ne contient en réalité que la première ligne. Chaque moveToNext recherche et trouve la correspondance suivante. getCount doit trouver tous les 1000. Pourquoi parcourir l'ensemble si vous n'avez besoin que de 10? Pourquoi itérer deux fois?
De plus, si votre requête n'utilise pas d'index, getCount peut être encore plus lent. GetCount peut dépasser 10000 enregistrements même si la requête ne correspond qu'à 100. Pourquoi créer une boucle 20000 au lieu de 10000?
moveToNext déplace le curseur à la ligne suivante. et c.getString (0) vous donnera toujours la première colonne, le cas échéant. Je pense que vous devriez faire quelque chose de similaire à cela dans votre boucle
int index = c.getColumnIndex("Column_Name");
string = c.getString(index);
cursor.moveToFirst()
déplace le curseur sur la première ligne. Si vous savez que vous avez 6 colonnes et que vous voulez une chaîne contenant toutes les colonnes, essayez ce qui suit.
c.moveToFirst();
StringBuilder stringBuilder = new StringBuilder();
for(int i = 0; i < 6; i++){
stringBuilder.append(c.getString(i));
}
// to return the string, you would do stringBuilder.toString();
Je code mes boucles sur le miroir comme ceci:
cursor.moveToFirst();
while(!cursor.isAfterLast()) {
cursor.getString(cursor.getColumnIndex("column_name"));
cursor.moveToNext();
}
Ça marche toujours. Cela va récupérer les valeurs de la colonne "nom_colonne" de toutes les lignes. Votre erreur est que vous passez en boucle sur les lignes et non sur les colonnes. Pour boucler sur les colonnes:
cursor.moveToFirst();
for(int i = 0; i < cursor.getColumnNames().length; i++){
cursor.getString(i);
}
Cela fera une boucle sur les colonnes de la première ligne et récupérera chaque valeur de colonne.