#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
. Я буду вызывать этот класс tabledbhelper 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. Это была не новая проблема .. проблема заданного вопроса и спасибо за ваш ответ.. Я смог решить проблему, используя ваш ответ, а также немного погуглив