2014-05-19 11 views
0

我想使用SQL數據庫來存儲遊戲記錄。其實我沒有關於SQL的線索。我有一個「記錄」類應該管理記錄的輸入和輸出。另外我有一個SQLDatabaseHelper類,它提供了SQL數據庫。問題與android sql-query ...「沒有這樣的列」?

我的問題是下面一行:

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

我總是錯誤「沒有這樣的列:SYS103」 「SYS103」是一個類別的名稱。我不知道爲什麼可以閱讀。你有什麼主意嗎?

SQL創建表:

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

我猜寫的作品,光看不工作。

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) { 

     } 
    } 

我的方法來獲取數據從數據庫中,但由於某種原因器的columnIndex常是-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

你發現什麼不妥:'私有靜態最後絃樂INSERT_NEW_RECORD =「插入記錄(類別,displayrecord ,timerecord)values(「;'?在那裏指定的列名與表創建的列名相比較? –

+0

INSERT_NEW_RECORD之前使用過,現在是一個註釋,但我試圖再次使用它,並且改變了INSERT_NEW_RECORD行但唯一的區別是,我得到了另一個錯誤:android.database.sqlite.SQLiteException:接近「:12」:syn稅收錯誤(代碼1):,編譯時:插入記錄(類別,顯示記錄,記錄時間)值(SYS103,00:12.8,5819); –

回答

1

你需要逃避你的參數。

由於是,你的代碼執行查詢:

SELECT * FROM records WHERE category = SYS103 

這不是有效的SQL。它應該看起來像這樣:

SELECT * FROM records WHERE category = 'SYS103' 

並且您需要轉義撇號。你會更好依託rawQuery逃避你的參數:

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

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

謝謝你,現在我在「插入」行中有另一個錯誤。你有什麼主意嗎? –

+0

如果你想使用rawQuery:rawQuery(「INSERT INTO records(category,displayTime,recordTime)VALUES(?,?,?)」,new String [] {cat,dt,rt}) ;''使用'insert'可能會更好。 – 323go

+0

現在它沒有錯誤,但我無法從數據庫中獲取數據。我已經更新了上面的條目。 –