2014-10-31 70 views
-4

我正在开发一款正在开发Android移动应用程序的Capstone项目。 该应用程序显示了一个调查问题,用户让其他人来回答问题。答案存储在SQLite数据库表中。我成功地创建了数据库,从单选按钮获取输入,并永久地将答案存储在表中。 表中的每一列代表一个问题的答案。SQLite Android Count Query不起作用

现在我需要执行一个COUNT查询来计算每个列中具有特定条件的答案数。

实施例:

SELECT COUNT(KEY_GENDER) 
FROM TABLE_ANSWERS 
WHERE KEY_GENDER = "Female"; 

在上述查询,KEY_GENDER是gender列,所存储的数据或者是女性或男性。 TABLE_ANSWERS是表名。

此查询的功能是显示许多女性回答了调查。

以下是数查询代码片段,它位于一个数据库类:

// count of gender. 
    public int countGender(){ 

     String colName = "COUNT(" + KEY_GENDER +")" ; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery("SELECT" + colName + "FROM" + TABLE_ANSWERS + "WHERE" + KEY_GENDER + "=?" + new String[] {"Female"}, null) ; 


     while (cursor.moveToNext()) { 
      int colID = cursor.getColumnIndex(KEY_GENDER); 
      int colID2 = cursor.getColumnIndex(colName); 

     } 
     db.close(); 
     cursor.close(); 

     // return count 
     return cursor.getCount(); 

    } 

这里是另一个片断,其中查询是为了显示这两个“男性”和“女性”的数量使用组由:

// count of gender. 
    public int countGender(){ 

     String colName = " COUNT(" + KEY_GENDER +") " ; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     // Cursor cursor = db.rawQuery("SELECT " + colName + "FROM " + TABLE_ANSWERS + " WHERE " + KEY_GENDER + "=?" + new String[] {" Female"}, null) ; 
     Cursor cursor = db.rawQuery("SELECT " + KEY_GENDER + colName + "FROM " + TABLE_ANSWERS + " GROUP BY " + KEY_GENDER, null) ; 


     while (cursor.moveToNext()) { 
      int colID = cursor.getColumnIndex(KEY_GENDER); 
      int colID2 = cursor.getColumnIndex(colName); 

     } 
     db.close(); 
     cursor.close(); 

     // return count 
     return cursor.getCount(); 

    } 

下面的代码片断是在验证的onCreate方法结果Activity类应该使用计方法查询表TABLE_ANSWERS:

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

    DatabaseHandler db = new DatabaseHandler(ValidationResults.this); 
    TextView gender; 
    gender = (TextView) findViewById(R.id.textViewGender); 

    int genderResult; 
    genderResult = db.countGender(); 

    gender.setText(String.valueOf(genderResult)); 

} 

的目录下载:

10-31 15:31:19.666 2221-2221/arwa.conceptsurvey D/dalvikvm﹕ GC_FOR_ALLOC freed 68K, 5% free 3410K/3556K, paused 13ms, total 16ms 
10-31 15:31:19.754 2221-2221/arwa.conceptsurvey D/dalvikvm﹕ GC_FOR_ALLOC freed 3K, 4% free 3628K/3780K, paused 83ms, total 83ms 
10-31 15:31:19.770 2221-2221/arwa.conceptsurvey I/dalvikvm-heap﹕ Grow heap (frag case) to 6.030MB for 2536932-byte allocation 
10-31 15:31:19.826 2221-2230/arwa.conceptsurvey D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 3% free 6106K/6260K, paused 54ms, total 54ms 
10-31 15:31:20.686 2221-2221/arwa.conceptsurvey D/libEGL﹕ loaded /system/lib/egl/libEGL_genymotion.so 
10-31 15:31:20.690 2221-2221/arwa.conceptsurvey D/﹕ HostConnection::get() New Host Connection established 0xb93f2f40, tid 2221 
10-31 15:31:20.774 2221-2221/arwa.conceptsurvey D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_genymotion.so 
10-31 15:31:20.774 2221-2221/arwa.conceptsurvey D/libEGL﹕ loaded /system/lib/egl/libGLESv2_genymotion.so 
10-31 15:31:21.022 2221-2221/arwa.conceptsurvey W/EGL_genymotion﹕ eglSurfaceAttrib not implemented 
10-31 15:31:21.022 2221-2221/arwa.conceptsurvey E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from GradienCache 
10-31 15:31:21.038 2221-2221/arwa.conceptsurvey E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 16384 
10-31 15:31:21.062 2221-2221/arwa.conceptsurvey E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from Caches::initConstraints() 
10-31 15:31:21.066 2221-2221/arwa.conceptsurvey E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 16384 
10-31 15:31:21.066 2221-2221/arwa.conceptsurvey D/OpenGLRenderer﹕ Enabling debug mode 0 
10-31 15:31:21.086 2221-2221/arwa.conceptsurvey I/Choreographer﹕ Skipped 36 frames! The application may be doing too much work on its main thread. 
10-31 15:32:41.710 2221-2221/arwa.conceptsurvey D/dalvikvm﹕ GC_FOR_ALLOC freed 109K, 3% free 6992K/7172K, paused 10ms, total 11ms 
10-31 15:32:41.738 2221-2221/arwa.conceptsurvey E/SQLiteLog﹕ (1) near "SELECTCOUNT": syntax error 
10-31 15:32:41.738 2221-2221/arwa.conceptsurvey D/AndroidRuntime﹕ Shutting down VM 
10-31 15:32:41.738 2221-2221/arwa.conceptsurvey W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa4cfab20) 
10-31 15:32:41.750 2221-2221/arwa.conceptsurvey E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: arwa.conceptsurvey, PID: 2221 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{arwa.conceptsurvey/arwa.conceptsurvey.ValidationResults}: android.database.sqlite.SQLiteException: near "SELECTCOUNT": syntax error (code 1): , while compiling: SELECTCOUNT(gender)FROMAnswers 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
      at android.app.ActivityThread.access$800(ActivityThread.java:135) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5017) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: android.database.sqlite.SQLiteException: near "SELECTCOUNT": syntax error (code 1): , while compiling: SELECTCOUNT(gender)FROMAnswers 
      at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
      at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 
      at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) 
      at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
      at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
      at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 
      at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 
      at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) 
      at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253) 
      at arwa.conceptsurvey.DatabaseHandler.countGender(DatabaseHandler.java:211) 
      at arwa.conceptsurvey.ValidationResults.onCreate(ValidationResults.java:27) 
      at android.app.Activity.performCreate(Activity.java:5231) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
            at android.app.ActivityThread.access$800(ActivityThread.java:135) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:136) 
            at android.app.ActivityThread.main(ActivityThread.java:5017) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
            at dalvik.system.NativeStart.main(Native Method) 
10-31 15:32:44.474 2221-2221/arwa.conceptsurvey I/Process﹕ Sending signal. PID: 2221 SIG: 9 

的问题是:每当我按下按钮定位到验证结果的活动,以显示查询结果,应用程序停止并显示此消息:“不幸的是,应用程序有停止“,显然不显示任何计数查询结果。

当我从验证结果活动中取出数据库代码时,该活动当然适用于空白页面,因为它不包含任何代码。所以,我认为主要问题只来自于计数查询。

我从名为Android Database Programming的教科书中获得了这些查询的结构。 我也尝试改变结构和其他东西,使其工作。 我一直在寻找网络和教科书来解决问题,并让计数查询工作。

那么,我的计数查询有什么问题?我怎样才能使它工作并显示结果? 我很感激你的帮助,因为我必须尽快提交这个项目。

预先感谢您。

更新:我有一个SQLite关键字间隔的语法问题。我通过向关键字添加空格在上面的代码中修复了它。

+1

间距是你的问题,你只需要一个空间。它应该是“FROM Answers”或“SELECT COUNT”。它不能读取“FROMAnswers”或“SELECTCount” – Jawascript 2014-10-31 16:24:07

+0

问题是偏离主题的:“这个问题是由于不能再现的问题或简单的印刷错误引起的。”尽管类似的问题可能是关于主题的,一个以不太可能帮助未来读者的方式解决。 ' – Selvin 2014-10-31 16:26:39

+0

sheesh。阅读错误信息? – 2014-10-31 16:40:31

回答

6

正如你可以在你的日志

"SELECTCOUNT": syntax error (code 1): 

SELECT单词后面添加空格看到:

db.rawQuery("SELECT " 

同样为FROM和像WHERE, GROUP保留字等

+0

他是正确的,您需要确保手动添加空格 – Jawascript 2014-10-31 16:25:36

+0

@Pedro Oliveira是的,SQL关键字没有空格。现在我修复了它,并添加了间距,但查询仍然不起作用。根本问题是什么?谢谢。 – 2014-10-31 19:30:35

+0

更新你的问题。如果问题不是SQL相关,则将其标记为答案并开始新帖子。 – 2014-10-31 19:37:03