gpt4 book ai didi

java - 从 SQLite Column 中获取所有数字字符串并计算总和

转载 作者:太空狗 更新时间:2023-10-29 13:46:48 24 4
gpt4 key购买 nike

我是 Android 和 SQLite 的新手。我在 SQLite 中有一个只有数字的列“AMOUNT”,我可以在 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});
}

}

这是 Activity

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 解决方案。或者如果上了listview更容易做计算

最佳答案

解决方案第 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),但上面是一个异常(exception),其中实际的列名(即 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));
}
  • 请注意,以上是原理代码,尚未经过测试,因此可能包含一些错误。

关于java - 从 SQLite Column 中获取所有数字字符串并计算总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52232087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com