2013-02-17 81 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,并发布在这里?