столбец не существует исключения при попытке суммирования в запросе sqlite в Android

#android #sqlite

#Android #sqlite

Вопрос:

Я использую базу данных SQLite для хранения данных .. но когда я пытаюсь суммировать столбцы с помощью запроса, я получаю ошибку Column doesn't exists , как показано ниже:

 select _id, column1, sum(column2),sum(column3) from table
 

В то же время, когда я пишу без суммы, я могу видеть результат в приложении, как показано ниже.

 select _id, column1, column2,column3 from table
 

Column2 и Column3 являются Real столбцами типа данных.

Я понятия не имею об этом поведении, почему оно ведет себя таким образом.

Код для извлечения столбцов из курсора.

 summaryviewholder.Total.setText(String.valueOf(getsummary.getInt(getsummary.getColumnIndexOrThrow(st.column2))));
 

Logcat:

 E/AndroidRuntime(8187): FATAL EXCEPTION: main
06-25 15:53:24.011: E/AndroidRuntime(8187): Process: com.example.portfoliomanager, PID: 8187
06-25 15:53:24.011: E/AndroidRuntime(8187): java.lang.IllegalArgumentException: column 'Buy_Qua' does not exist
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at com.example.StockDirector.stockmanager$popsummarystock.bindView(stockmanager.java:518)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at com.example.StockDirector.stockmanager$popsummarystock.newView(stockmanager.java:539)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.widget.CursorAdapter.getView(CursorAdapter.java:250)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.widget.AbsListView.obtainView(AbsListView.java:2720)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1274)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.widget.ListView.onMeasure(ListView.java:1186)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.View.measure(View.java:17387)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.widget.RelativeLayout.measureChild(RelativeLayout.java:689)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:473)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.View.measure(View.java:17387)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5352)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.View.measure(View.java:17387)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5352)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.View.measure(View.java:17387)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5352)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:391)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.View.measure(View.java:17387)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5352)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2533)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.View.measure(View.java:17387)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2214)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1351)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1550)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1235)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6476)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.Choreographer.doCallbacks(Choreographer.java:603)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.Choreographer.doFrame(Choreographer.java:573)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.os.Handler.handleCallback(Handler.java:733)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.os.Handler.dispatchMessage(Handler.java:95)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.os.Looper.loop(Looper.java:157)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at android.app.ActivityThread.main(ActivityThread.java:5356)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at java.lang.reflect.Method.invokeNative(Native Method)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at java.lang.reflect.Method.invoke(Method.java:515)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
06-25 15:53:24.011: E/AndroidRuntime(8187):     at dalvik.system.NativeStart.main(Native Method)
06-25 15:53:25.486: I/Process(8187): Sending signal. PID: 8187 SIG: 9
 

Комментарии:

1. getsummary.getColumnIndexOrThrow(st.column4) … Где column4 определено? Не возражаете показать свой DBHelper класс?

2. @DerGolem Я прошу прощения за его столбец 2, а не столбец 4 .. обновил мой вопрос. Спасибо за ваш ответ.

3. Не возражаете показать свой DBHelper класс? Потому что он не находит столбец Buy_Qua . Я подозреваю, что таблица не создается из-за орфографической ошибки в команде CREATE TABLE .

4. @DerGolem Я создал класс table .. прошу прощения, я не могу показать все столбцы на общедоступном форуме, но вставил до Buy_Qua . Я буду вызывать этот класс table dbhelper class для создания таблиц и любых других классов, где это необходимо

5. Извините, я не могу вам помочь, если я не вижу реального , полного оператора CREATE TABLE.

Ответ №1:

Вы должны назвать свои строки, которые вы суммируете.

Другие примечания:

Если вы используете sum (или функцию агрегирования в целом), вы не можете выбрать другие строки, которые не агрегируются, иначе вы не получите надлежащего результата. Кроме того, используйте Float для получения значения из базы данных, поскольку вы используете Real тип данных (число с плавающей запятой) в sqlite.

Поэтому вместо этого:

 select _id, column1, sum(column2),sum(column3) from table
 

Вы должны сделать что-то вроде этого:

 select column1, sum(column2) AS sum1, sum(column3) AS sum2 from table group by column1;
 

И к значениям:

 summaryviewholder.Total.setText(String.valueOf(getsummary.getFloat(getsummary.getColumnIndexOrThrow("sum1"))));
 

Комментарии:

1. Спасибо за ваш ответ, когда я пытаюсь так, как вы предложили, он выдает ошибку, например _id , не существует

2. Вы не сможете получить _id, если будете суммировать таким образом. Результаты не для отдельных строк, а для группы column1, которые не имеют уникального идентификатора. Я обновил свой ответ, чтобы решить другую проблему.

3. Я пробовал в соответствии с вашим предложением, но получаю ошибку ‘Column _id’ не существует

4. Удалите _id из select и не используйте его здесь. Вы не можете выбрать его, если выполняете суммирование.

5. Я не знаю, почему, но ваш подход не работает, всегда ошибка Column _id не завершается.. Спасибо за вашу помощь.

Ответ №2:

Когда вы пишете SELECT sum(Column2) , то имя выходного столбца равно sum(Column2) .

Вы должны либо прочитать значения столбцов по их индексу (что опасно, когда запрос когда-либо меняется), либо присвоить выходному столбцу другое имя:

 SELECT sum(Column2) AS Column2Sum ...
 

Комментарии:

1. Спасибо за ваш ответ в этом случае, с каким именем я должен повторно извлечь столбец из курсора.. Я имею в виду с именем столбца или именем псевдонима?

2. Имя псевдонима становится именем столбца.

3. В соответствии с вашим предложением, которое я изменил, в этом случае я получил другую ошибку .. пожалуйста, предложите. Я дал имя alais как a . Обновил мой вопрос, спасибо

4. Проблема в вашем вопросе решена. Для поиска справки по другой проблеме задайте новый вопрос.

5. Это была не новая проблема .. проблема заданного вопроса и спасибо за ваш ответ.. Я смог решить проблему, используя ваш ответ, а также немного погуглив