2016-01-15 1 views
1

Je crée une application pour enregistrer des affectations pour différentes classes. Chaque classe a son propre ID unique, de sorte que les affectations répertoriées pour chaque classe ne se chevauchent pas dans d'autres classes. Voici une méthode que j'ai faite pour trouver le rowid pour une certaine classe.Utiliser SQLite dans Android pour obtenir RowID

public int getIdFromClassName(String className){ 
    String query = "SELECT rowid FROM " + CLASSES_TABLE_NAME + " WHERE " + CLASSES_COLUMN_NAME + " = '" + className + "'"; 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor res = db.rawQuery(query, null); 
    return res.getColumnIndex("id"); 
} 

Cependant, cela renvoie toujours la valeur -1.

Des réflexions sur ce qu'il faut changer pour retourner la bonne valeur rowid?

EDIT:

@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
    db.execSQL(
      "create table " + CLASSES_TABLE_NAME + " " + 
        "(id integer primary key, " + CLASSES_COLUMN_NAME + " text)" 
    ); 
    db.execSQL(
      "create table " + ASSIGNMENTS_TABLE_NAME + " " + 
        "(id integer primary key, " + ASSIGNMENTS_COLUMN_NAME + " text, " + ASSIGNMENTS_COLUMN_TOTAL_POINTS 
        + " INTEGER, " + ASSIGNMENTS_COLUMN_CLASS_ID + " INTEGER)"); 

} 
+0

avez-vous essayé? return res.getString (res.getColumnIndex ("id")); – kulvinder

+0

Cela reviendrait une chaîne, mais je cherche l'id sous la forme d'un – Kinoscorpia

+0

int il dépend ... le type de données que vous utilisez pour id ... je pense que vous pouvez également utiliser getInt .. si son type de données est nombre entier – kulvinder

Répondre

0

res.getColumnIndex ("id") va vous obtenir l'index de colonne de la colonne avec le nom "id". et puisque vous obtenez -1, il ne peut pas le trouver .. êtes-vous sûr que votre colonne d'identification n'est pas "_id"?

Pour obtenir ce pour vous travailler devriez faire quelque chose comme ça ..

res.getLong(res.getColumnIndex("_id")); 

Cursor.getColumnIndex()

Cursor.getLong()

(je vous recommande d'utiliser getLong() plutôt que getInt() parce que SQLite les ID de base de données peuvent devenir plus grands que les int).

+0

Cela renvoie l'exeption: android.database.CursorIndexOutOfBoundsException: Index -1 demandé, avec une taille de 1 – Kinoscorpia

+0

@Kinoscorpia Quel est le nom de votre colonne ID? Il renverra -1 s'il ne trouve pas "id" ou "_id". EDIT: A en juger par le SQL, le nom de votre colonne est "rowid" correct?alors essayez res.getLong (res.getColumnIndex ("rowid")); –

+0

Ajout de la méthode onCreate – Kinoscorpia

0
public int getIdFromClassName(String className) { 
     String query = "SELECT rowid FROM " + CLASSES_TABLE_NAME + " WHERE " 
       + CLASSES_COLUMN_NAME + " = '" + className + "'"; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor res = db.rawQuery(query, null); 
     if (res != null) { 
      if (res.moveToFirst()) { 
       do { 
        return Integer.parseInt(res.getString(res.getColumnIndex("id"))); // if your column name is rowid then replace id with rowid 
       } while (res.moveToNext()); 
      } 
     } else { 
      Toast.makeText(context, "cursor is null", Toast.LENGTH_LONG).show(); 
     } 
    } 

Vérifiez votre curseur si son null vérifier votre journal que votre table est créée avec succès et si sa marque non nul que votre table a la colonne id en elle.

0

Vous pouvez essayer ceci:

public int getIdFromClassName(String className){ 
String query = "SELECT id FROM " + CLASSES_TABLE_NAME + " WHERE " + CLASSES_COLUMN_NAME + " = '" + className + "'"; 
SQLiteDatabase db = this.getReadableDatabase(); 
Cursor res = db.rawQuery(query, null); 
int id=-1; 
If(res!=null&&res.moveToFirst()) 
id=res.getInt(res.getColumnIndex("id")); 
return id; 
} 
1

La colonne retournée par votre requête est appelée rowid, de sorte que vous ne trouverez pas une colonne appelée id.

Vérifiez que vous utilisez le même nom de colonne dans la requête et dans l'appel à getColumnIndex.

Et l'index de cette colonne est toujours zéro; vous devez également lire la valeur réelle de la colonne:

int colIndex = res.getColumnIndexOrThrow("rowid"); // = 0 
if (res.moveToFirst()) { 
    return res.getInt(colIndex); 
} else { 
    // not found 
} 

Cependant, Android a un helper function qui le rend beaucoup plus facile à lire une valeur unique:

public int getIdFromClassName(String className){ 
    String query = "SELECT rowid" + 
        " FROM " + CLASSES_TABLE_NAME + 
        " WHERE " + CLASSES_COLUMN_NAME + " = ?;"; 
    SQLiteDatabase db = this.getReadableDatabase(); 
    return DatabaseUtils.longForQuery(db, query, new String[]{ className }); 
}