2014-05-19 3 views
0

Je souhaite utiliser une base de données SQL pour stocker des enregistrements pour un jeu. En fait, je n'ai pas la moindre idée de SQL. J'ai une classe "Records" qui devrait gérer l'entrée et la sortie des enregistrements. De plus, j'ai une classe SQLDatabaseHelper qui fournit la base de données SQL.Problème avec android sql-query ... "pas une telle colonne"?

Mon problème est la ligne suivante:

crsRecord = sqliteDatabase.rawQuery(QUERY_GET_RECORD + category, null); 

Je suis toujours l'erreur "No such colonne: SYS103" "SYS103" est un nom d'une catégorie. Je ne sais pas pourquoi on peut le lire. Avez-vous une idée?

création de table SQL:

CREATE TABLE records (
      id INTEGER PRIMARY KEY AUTOINCREMENT, 
      category VARCHAR(30) NOT NULL, 
      displaytime VARCHAR(12) NOT NULL, 
      recordtime VARCHAR(10) NOT NULL); 

Je suppose que l'écriture des œuvres que la lecture ne fonctionne pas.

public class Records { 
      private SQLiteOpenHelper sqliteOpenHelper; 
      private SQLiteDatabase sqliteDatabase; 

      private static final String INSERT_NEW_RECORD = "insert into records(category, displayrecord, timerecord) values("; 
      private static final String QUERY_GET_RECORD = "SELECT * FROM records WHERE category = "; 

      public Records(Context context){ 
       sqliteOpenHelper = new SQLDatabaseHelper(context); 
       sqliteDatabase = sqliteOpenHelper.getWritableDatabase(); 
      } 

      public void addRecord(String category, String displaytime, String timerecord){ 
       ContentValues data = new ContentValues(); 

       data.put("category", category); 
       data.put("displaytime", displaytime); 
       data.put("recordtime", timerecord); 

       sqliteDatabase.insert("records", null, data); 
     //  sqliteDatabase.execSQL(INSERT_NEW_RECORD + category + ", " + strTime + ", " + dblTime + ");"); 
      } 

      public String[] getRecord(String category){ 
       String[] record = new String[3]; 
       Cursor crsRecord; 
       try{ 
        crsRecord = sqliteDatabase.rawQuery(QUERY_GET_RECORD + category, null); 
       }catch(SQLiteException e){ 
        Log.d("database", e.getMessage()); 
        String[] nullRecord = {category, "00:00.0", "0"}; 
        return nullRecord; 
       } 

       int i=0; 


       while(crsRecord.moveToNext()){ 
        record[i] = crsRecord.getString(0); 
        i++; 
       } 

       return record; 

      } 
     } 

    public class SQLDatabaseHelper extends SQLiteOpenHelper { 
     private Context context; 

     public SQLDatabaseHelper(Context context){ 
      super(
       context, 
       context.getResources().getString(R.string.dbname), 
       null, 
       Integer.parseInt(context.getResources().getString(R.string.version))); 
      this.context=context; 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      for(String sql : context.getResources().getStringArray(R.array.create)){ 
       db.execSQL(sql); 
      } 
      Log.d("Database", "creat succesfully"); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     } 
    } 

Ma méthode pour obtenir des données sur la base de données, mais pour une raison quelconque le columnIndex est alway -1:

public String[] getRecord(String category){ 
    String[] record = new String[3]; 
    Cursor crsRecord; 

     crsRecord = sqliteDatabase.rawQuery(QUERY_GET_RECORD, new String[]{ category }); 

    int i=0; 
    crsRecord.moveToFirst(); 
    while(!crsRecord.isAfterLast()){ 

     // Instead of using an int literal to get the colum index, 
     // use the getColumnIndex method 
     int index = crsRecord.getColumnIndex(category); 
     if (index == -1) { 
      String[] nullRecord = {category, "00:00.0", "0"}; 
      return nullRecord; 
     } 
     else { 
      record[i] = crsRecord.getString(index); 
      i++; 
     } 

     crsRecord.moveToNext(); 
    } 



    while(crsRecord.moveToNext()){ 
     record[i] = crsRecord.getString(0); 
     i++; 
    } 

    return record; 

} 
+0

Avez-vous remarqué quelque chose de mal avec: 'static private String INSERT_NEW_RECORD = « insérer dans les enregistrements (catégorie, displayrecord , timerecord) values ​​(";'? Les noms de colonne spécifiés par rapport aux noms de colonnes pour la création de la table? –

+0

INSERT_NEW_RECORD était déjà utilisé. Maintenant, c'est un commentaire, mais j'ai essayé de l'utiliser à nouveau et j'ai changé la ligne INSERT_NEW_RECORD mais la seule différence est que j'ai une autre erreur: android.database.sqlite.SQLiteException: près de ": 12": syn erreur d'impôt (code 1):, lors de la compilation: insérer dans les enregistrements (catégorie, affichage de l'écran, temps d'enregistrement) valeurs (SYS103, 00: 12.8, 5819); –

Répondre

1

Vous aurez besoin d'échapper à vos paramètres.

Comme il est, votre code exécute la requête:

SELECT * FROM records WHERE category = SYS103 

Ce n'est pas valide SQL. Il devrait ressembler à ceci:

SELECT * FROM records WHERE category = 'SYS103' 

et vous avez besoin d'échapper aux apostrophes. Vous feriez mieux de compter sur rawQuery pour échapper à vos paramètres:

private static final String QUERY_GET_RECORD 
          = "SELECT * FROM records WHERE category = ?"; 

et

crsRecord = 
    sqliteDatabase.rawQuery(QUERY_GET_RECORD, new String[]{ category }); 
+0

Merci pour cela ... maintenant j'ai une autre erreur dans la ligne "insert". Avez-vous une idée? –

+0

Faites la même chose ici, si vous voulez utiliser rawQuery: 'rawQuery (" INSERT INTO enregistrements (category, displayTime, recordTime) VALEURS (?,?,?) ", New String [] {cat, dt, rt}) 'Vous feriez mieux d'utiliser 'insert'. – 323go

+0

Maintenant, cela fonctionne sans erreur, mais je ne suis pas en mesure d'extraire des données de ma base de données. J'ai mis à jour mon entrée ci-dessus. –

Questions connexes