2013-02-17 56 views
0

我曾嘗試使用下面的查詢在Android的SQLite創建了兩個表:問題執行查詢

public static final String TABLE_SEMESTER_CREATE = "CREATE TABLE " 
     + SemesterTable.TABLE_NAME + " (" + SemesterTable.ID_PK 
     + " INTEGER PRIMARY KEY AUTOINCREMENT, " + SemesterTable.TITLE 
     + " TEXT," + SemesterTable.START_DATE + " TEXT, " 
     + SemesterTable.END_DATE + " TEXT) "; 


public static final String TABLE_COURSE_CREATE = "CREATE TABLE " 
     + CourseTable.TABLE_NAME + " (" + CourseTable.ID_PK 
     + " INTEGER PRIMARY KEY AUTOINCREMENT, " + CourseTable.COURSE_CODE 
     + " TEXT, " + CourseTable.COURSE_NAME + " TEXT, " 
     + CourseTable.LOCATION + " TEXT, " + CourseTable.SEMESTER_ID_FK 
     + " INTEGER, " + "FOREIGN KEY (" + CourseTable.SEMESTER_ID_FK 
     + ") REFERENCES " + SemesterTable.TABLE_NAME + " (" 
     + SemesterTable.ID_PK + "));"; 

然後我父表和子表中插入一些數據。問題是,當我執行查詢時:

String query = "SELECT * FROM " + CourseTable.TABLE_NAME + " WHERE " 
      + CourseTable.SEMESTER_ID_FK + " = 1;"; 
    database.rawQuery(query, null);; 

它不執行。你能幫我擺脫這個錯誤嗎? 我也試過了。

database.query(CourseTable.TABLE_NAME, CourseTable.allColumns, 
    CourseTable.SEMESTER_ID_FK + " = ? ", 
    new String[] { String.valueOf(semesterID) }, null, null, null); 

但它也不工作!

+5

發佈錯誤日誌。 – 2013-02-17 12:03:53

回答

2

問題是char ;這是不允許的。所以更正你的查詢是這樣的:

String query = "SELECT * FROM " + CourseTable.TABLE_NAME + " WHERE " 
      + CourseTable.SEMESTER_ID_FK + " = ?"; 
database.rawQuery(query, new String[] {String.valueOf(1)}); 

現在它會起作用。我建議你使用?被稱爲placeholder,將與價值從String-array被替換爲rawQuery()方法的第二個參數。

而且從TABLE_COURSE_CREATEString除去最後;字符。

注意:請務必使用它,並採用此方法避免任何問題。

+0

這是Android的具體限制嗎?因爲SQLite在查詢結尾使用';'完全沒有問題。雖然我同意參數綁定。 – Martijn 2013-02-18 08:25:35

+0

如果你直接在SQLite Expert或Oracle SQLData Developer等工作,使用db **';'** char是確定的,但是如果你從應用層連接到db(Java,...)**';' **是不允許的(這也是當你在一些WebApplication上工作的時候是經典的Java SE,這個字符在這裏也是不允許的。) – Sajmon 2013-02-18 09:19:10

+0

好的,所以這是一個Java限制。 – Martijn 2013-02-18 13:20:24

0

你錯過了等號嗎?你的第一個查詢評估,以這樣的:

SELECT * FROM TABLE WHERE FIELD1 

更改此:

"SELECT * FROM " + CourseTable.TABLE_NAME + 
" WHERE " + CourseTable.SEMESTER_ID_FK + "1;" 

要:

"SELECT * FROM " + CourseTable.TABLE_NAME + 
" WHERE " + CourseTable.SEMESTER_ID_FK + "=1;" 
+0

謝謝@sgeddes我在這裏發佈時忘記了放置=標誌。 '「SELECT * FROM」+ CourseTable.TABLE_NAME + 「WHERE」+ CourseTable.SEMESTER_ID_FK +「= 1;」'也不起作用。 – 2013-02-17 12:24:23

+2

@ user1773155 - 打印出來時,您的查詢會評估哪些內容?你可以直接對數據庫運行它嗎?假設有效,那麼你的問題可能在其他地方。 – sgeddes 2013-02-17 12:26:57

+0

我在android項目中執行它。當應用程序到達此查詢的執行點時,它停止。 – 2013-02-17 12:38:00

1

兩個提示,以增加你得到有用的答案的機會(或更好,自己找出問題所在):

  1. 什麼是實際的錯誤信息? SQLite通常會告訴你爲什麼它無法運行你的查詢。
  2. 而不是你在這裏給出的(幾乎難以辨認的)代碼,你可以log產生的SQL,併發布在這裏?