Получить все числовые строки из столбца SQLite и вычислить общую сумму - PullRequest
0 голосов
/ 08 сентября 2018

Я новичок в Android и в SQLite.У меня есть столбец «СУММА» просто чисел в SQLite, который я могу показать в ListView.Но я не могу понять, каким образом я понимаю, добавить их все и отобразить в TextView.

Вот база данных Helper

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "people.db";
    private static final String TABLE_NAME = "people_table";
    private static final String COL1 = "ID";
    private static final String COL2 = "DATE";
    private static final String COL3 = "DESCRIPTION";
    private static final String COL4 = "AMOUNT";


    DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
                " DATE TEXT, DESCRIPTION TEXT, AMOUNT TEXT)";
        db.execSQL(createTable);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }

    public boolean addData(String inc_date, String inc_description, String inc_amount){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL2, inc_date);
        contentValues.put(COL3, inc_description);
        contentValues.put(COL4, inc_amount);

        long result  = db.insert(TABLE_NAME, null, contentValues);

        return result != -1;
    }

    public Cursor showData(){
        SQLiteDatabase db = this.getWritableDatabase();
        return db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
    }

    public boolean updateData(String id, String name, String email, String tvShow){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL1,id);
        contentValues.put(COL2,name);
        contentValues.put(COL3,email);
        contentValues.put(COL4,tvShow);
        db.update(TABLE_NAME, contentValues, "ID = ?", new String[] {id});
        return true;
    }

    public Integer deleteData(String id){
        SQLiteDatabase db = this.getWritableDatabase();
        return db.delete(TABLE_NAME, "ID = ?", new String[] {id});
    }

}

А вот операция

import android.database.Cursor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;

public class IncPag extends AppCompatActivity {

    DatabaseHelper peopleDB;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.inc_pag);
        all_inc_dat();
        amo_sum();
    }

    private void all_inc_dat(){
        TextView inc_data=findViewById(R.id.tex_inc);
        ListView dat_col=findViewById(R.id.dat_col);
        ListView des_col=findViewById(R.id.des_col);
        ListView amo_col=findViewById(R.id.amo_col);
        peopleDB=new DatabaseHelper(this);

        Cursor data = peopleDB.showData();

        if (data.getCount() == 0) {
            inc_data.setText(R.string.no_data_found);
            return;
        }
        ArrayList<String> dat_lis = new ArrayList<>();
        ArrayList<String> des_lis = new ArrayList<>();
        ArrayList<String> amo_lis = new ArrayList<>();

        while (data.moveToNext()) {
            dat_lis.add(data.getString(data.getColumnIndex( "DATE")));
            des_lis.add(data.getString(data.getColumnIndex( "DESCRIPTION")));
            amo_lis.add(data.getString(data.getColumnIndex( "AMOUNT")));

        }

        ListAdapter dat_ada = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dat_lis);
        dat_col.setAdapter(dat_ada);
        ListAdapter des_ada = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, des_lis);
        des_col.setAdapter(des_ada);
        ListAdapter amo_ada = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, amo_lis);
        amo_col.setAdapter(amo_ada);
    }

    private void amo_sum(){
        TextView tv_sum=findViewById(R.id.tv_sum);
        tv_sum.setText(amount total?);
    }
}

Если его легче вычислить в помощнике по базам данных, то покажите мне решение SQLite.или если расчёт проще сделать после просмотра списка

1 Ответ

0 голосов
/ 08 сентября 2018

Решение Часть 1

Вы можете добавить следующий метод к помощнику базы данных

public long getAmountSum(){
    long rv = 0;
    String[] columns = new String[]{"sum(" + COL4 + ")"};
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor csr = db.query(TABLE_NAME,columns,null,null,null,null,null);
    if (csr.moveToFirst()) {
        rv = csr.getLong(0);
    }
    csr.close();
    return rv;
}
  • Обратите внимание, что если значение в столбце AMOUNT не является допустимым целым числом, ему будет присвоено значение 0 для этой строки.

  • Это равносильно выполнению запроса SELECT sum(AMOUNT) FROM people_table;, но использует удобный метод SQLiteDatabase query , а не метод rawQuery .

    • Лучше использовать удобные методы, когда они могут использоваться, а не метод rawQuery.
    • Рекомендуется также использовать один источник для имен таблиц и столбцов, а не жестко кодировать имена столбцов каждый раз, когда они используются (следовательно, используется COL4 вместо "AMOUNT").
    • Несмотря на использование жестко закодированных смещений столбцов (например, 0 в приведенном выше), приведенное выше является исключением, когда фактическое имя столбца (т.е. sum(AMOUNT)), так как оно является производным от базового сгенерированного SQL, может быть более проблематичным его кодирование, чем кодирование смещения столбца (первый / единственный столбец, поэтому оно всегда будет 0).
  • Если в таблице нет строк, будет возвращено 0.

Решение Часть 2

Вышеуказанное можно использовать в сочетании с измененным методом amo_sum согласно: -

private void amo_sum(){
    TextView tv_sum=findViewById(R.id.tv_sum);
    tv_sum.setText(String.valueOf(peopleDB.getAmountSum));
}
  • Обратите внимание, что приведенный выше код является принципиальным и не был проверен, поэтому может содержать некоторые ошибки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...