2016-12-23 105 views
1

所以在我的應用程序中,我使用get和set方法。當它執行set方法時,應用程序不會崩潰,但當它到達get方法時,它會崩潰。我發現當它到達get方法中的db.query()行時它崩潰了,但我認爲問題也可能在set方法中,因爲它們都給出錯誤消息。插入和執行查詢在android的sqlite數據庫錯誤

這裏是我的代碼:

公共類MyDBHandler擴展SQLiteOpenHelper {

public static final int DATABASE_VERSION = 1; 
public static final String COLUMN_ID = "_id"; 
public static final String TABLE_VALUES = "values"; 
public static final String COLUMN_TARGET = "target"; 
public static final String COLUMN_CURRENT = "current"; 

public MyDBHandler(Context context){ 

    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 

    String query1 = "CREATE TABLE " + TABLE_VALUES + " (" + 
      COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
      COLUMN_TARGET + " INT, " + 
      COLUMN_CURRENT + " INT);"; 

    db.execSQL(query1); 


} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) { 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_VALUES); 
    onCreate(db); 
} 


public void setTarget(int tar){ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(COLUMN_TARGET, tar); 
     values.put(COLUMN_CURRENT, 0); 
     db.insert(TABLE_VALUES, null, values); 
     db.close(); 

} 


public int getTarget() { 
    SQLiteDatabase db = this.getReadableDatabase(); 
    int targetVal=0; 

String[] columns = {COLUMN_TARGET}; 
Cursor c = db.query(TABLE_VALUES, columns, null, null, null, null, String.valueOf(1)); 


if(c.getCount()>0) 
    { 
     c.moveToFirst(); 

     targetVal=c.getInt(0); 
    } 


    db.close(); 
    c.close(); 
    return targetVal; 
} 

} 

設定功能用在這裏:

public class home extends AppCompatActivity { 

MyDBHandler db; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home); 

    db = new MyDBHandler(this); 

} 

public void enter(View view) 
{ 
    EditText target = (EditText) findViewById(R.id.target); 
    TextView warning = (TextView) findViewById(R.id.warning); 

    String check = target.getText().toString(); 
    if(check.equals("")) { 
     // Intent a = new Intent(this, MainActivity.class); 
     //startActivity(a); 
     warning.setText("Please enter a value"); 
     return; 
    } 
    else { 
     int input = Integer.parseInt(check); 
     Log.d("tag", "111\n"); 
     db.setTarget(input); 
     Log.d("tag", "222\n"); 
     //int i = db.getTarget(); 

     //Log.d("tag","input is " + i); 


     Intent a = new Intent(this, MainActivity.class); 
     startActivity(a); 

    } 




} 


} 

get函數在這裏使用:

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

public void onTrack(View view){ 
    Log.d("tag", "traaaack\n"); 
    Intent i = new Intent(this, Track.class); 
    startActivity(i); 
} 

} 

,這裏是來自日誌的錯誤消息部分。

這是當集方法被稱爲:

E/SQLiteLog:(1)附近的 「值」:語法錯誤 E/SQLiteDatabase:錯誤插入電流= 0的目標= 2000 android.database.sqlite .SQLiteException:近 「值」:語法錯誤(代碼1):在編譯:INSERT INTO值(電流,目標)VALUES

這是當get方法被調用(?,?):

E/SQLiteLog:(1)接近「值」:語法錯誤 E/AndroidRuntime:FATAL EX CEPTION:main java.lang.RuntimeException:無法啓動活動ComponentInfo {com.example.user.calorietracker/com.example.user.calorietracker.Track}:android.database.sqlite.SQLiteException:near「values」:語法錯誤(代碼1):,編譯時:SELECT target FROM values LIMIT 1

我已經嘗試了很多東西來解決它,但無法弄清楚我做錯了什麼。從字面上來說,任何建議都會有所幫助!謝謝

+0

將您的表的名稱從'values'更改爲其他名稱或使用雙引號來轉義表名:'「values」' – Dekel

回答

1

根據SQLite Keywords的列表 - 單詞values是您不能用於表(或列或許多其他事物)名稱的單詞之一。

有幾種方法來解決這個問題:

  1. 不要使用這個詞。例如,您始終可以使用tbl_values
  2. 你可以引用那個詞:

'關鍵字'        關鍵字在單引號是一個字符串文字。
「關鍵字」     雙引號中的關鍵字是標識符。
[keyword]      方括號內的關鍵字是一個標識符。這不是標準的SQL。此引用機制由MS Access和SQL Server使用,幷包含在SQLite中以實現兼容性。
`關鍵字`     嚴重重音(ASCII碼96)中包含的關鍵字是一個標識符。這不是標準的SQL。這種引用機制由MySQL使用,幷包含在SQLite中用於兼容性。

+0

謝謝!!!我永遠不會意識到這一點! – Csbk

+0

歡迎您:)也將讚賞答案以及(左邊的箭頭)。謝謝! – Dekel

相關問題