Java 使用Android studio,当我单击按钮时,我的应用程序强制关闭

Java 使用Android studio,当我单击按钮时,我的应用程序强制关闭,java,android,sqlite,Java,Android,Sqlite,嗨,我正在android studio 3.3中制作一个账单拆分应用程序。我用sqlite创建了一个数据库,它存储产品的名称和成本。当我试图从数据库获取输入的总成本并将其存储在文本视图中时,应用程序关闭。我得出的结论是,问题出在MyDBHandler.java public class MyDBHandler extends SQLiteOpenHelper{ private static final int DATABASE_VERSION = 6; private stati

嗨,我正在android studio 3.3中制作一个账单拆分应用程序。我用sqlite创建了一个数据库,它存储产品的名称和成本。当我试图从数据库获取输入的总成本并将其存储在文本视图中时,应用程序关闭。我得出的结论是,问题出在
MyDBHandler.java

public class MyDBHandler extends SQLiteOpenHelper{
    private static final int DATABASE_VERSION = 6;
    private static final String DATABASE_NAME = "productDB.db";
    public static final String TABLE_PRODUCTS = "products";
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_PRODUCTNAME = "productname";
    public static final String COLUMN_PRODUCTCOST = "productcost";


    //We need to pass database information along to superclass
    public MyDBHandler(Context context, String name, 
    SQLiteDatabase.CursorFactory factory, int version) {
        super(context, DATABASE_NAME, factory, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String query = "CREATE TABLE " + TABLE_PRODUCTS + "(" +
                COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COLUMN_PRODUCTNAME + " TEXT " + "," +
                COLUMN_PRODUCTCOST + " INTEGER " +
                ");";
        db.execSQL(query);
    }


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


    //Add a new row to the database
    public void addProduct(Products product){
        ContentValues values = new ContentValues();
        values.put(COLUMN_PRODUCTNAME, product.get_productname());
        values.put(COLUMN_PRODUCTCOST, product.get_productcost());
        SQLiteDatabase db = getWritableDatabase();
        db.insert(TABLE_PRODUCTS, null, values);
        db.close();
    }

    //Delete a product from the database
    public void deleteProduct(String productName){
        SQLiteDatabase db = getWritableDatabase();
        db.execSQL("DELETE FROM " + TABLE_PRODUCTS + " WHERE " + 
    COLUMN_PRODUCTNAME + "=\"" + productName + "\";");
    }

    //get the total sum of teh Product_Cost column
    //
    //  TODO: fix this method to display total
    //  NOTE: THIS IS YOUR PROBLEM
    //
    //
    public int GetTotal(){
        int temp;
        SQLiteDatabase db = getWritableDatabase();
        String query = " SELECT SUM(COLUMN_PRODUCTCOST) FROM " + TABLE_PRODUCTS + ";";
        Cursor cursor = db.rawQuery(query , null);
        if (cursor.moveToFirst()) {
            temp = cursor.getInt(0);
        }
        else return 0;

        cursor.close();


        return temp;
    }


    // converts the elements in the database to a string so you can print the database out.
    public String databaseToString(){
        String dbString = "";
        SQLiteDatabase db = getWritableDatabase();
        String query = "SELECT * FROM " + TABLE_PRODUCTS + " WHERE 1";// why not leave out the WHERE  clause?

        //Cursor points to a location in your results
        Cursor recordSet = db.rawQuery(query, null);
        //Move to the first row in your results
        recordSet.moveToFirst();

        //Position after the last row means the end of the results
        while (!recordSet.isAfterLast()) {
            // null could happen if we used our empty constructor
            if (recordSet.getString(recordSet.getColumnIndex("productname")) != null) {
                dbString += recordSet.getString(recordSet.getColumnIndex("productname"));
                dbString += "\t $";
                dbString += recordSet.getString(recordSet.getColumnIndex("productcost"));
                dbString += "\n";
            }
            recordSet.moveToNext();
        }
        db.close();
        return dbString;
    }

}



  public class MainActivity extends AppCompatActivity {

        EditText userInput;
        EditText userInputC;
        TextView recordsTextView;
        TextView Results;
        MyDBHandler dbHandler;

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

            userInput = (EditText) findViewById(R.id.user_Input);
            userInputC = (EditText) findViewById(R.id.user_InputC);
            recordsTextView = (TextView) findViewById(R.id.records_TextView);
            Results = (TextView) findViewById(R.id.Results);
            /* Can pass nulls because of the constants in the helper.
             * the 1 means version 1 so don't run update.
             */
            dbHandler = new MyDBHandler(this, null, null, 1);
            printDatabase();
        }

        //Print the database
        public void printDatabase(){
            String dbString = dbHandler.databaseToString();
            recordsTextView.setText(dbString);
            userInput.setText("");
            userInputC.setText("");
        }

        /*
        //Add a product to the database
        public void addButtonClicked(View view){
            // dbHandler.add needs an object parameter.
            int count = Integer.parseInt(Results.getText().toString());
            int num = Integer.parseInt(userInputC.getText().toString());
            count = count + num;

            String temp = Results.getText().toString();
            float temp1 = Float.parseFloat(temp);

            //Results.setText(Integer.toString(count));
            Results.setText(Float.toString(count));

            Products product = new Products(userInput.getText().toString(), temp1);
            dbHandler.addProduct(product);

            //Results = ;
            printDatabase();


        }*/

    @SuppressLint("SetTextI18n")
    public void addButtonClicked(View view){
        // dbHandler.add needs an object parameter.
        int usersinput = Integer.parseInt(userInputC.getText().toString());
        Products product = new Products(userInput.getText().toString(), usersinput);
        int temp = dbHandler.GetTotal();
        dbHandler.addProduct(product);
        Results.setText(Integer.toString(temp));
        printDatabase();


    }

        //Delete items
        public void deleteButtonClicked(View view){


            // dbHandler delete needs string to find in the db
            String inputText = userInput.getText().toString();
            dbHandler.deleteProduct(inputText);
            printDatabase();
        }

    }

这是一个错误的sql查询:

String query = " SELECT SUM(COLUMN_PRODUCTCOST) FROM " + TABLE_PRODUCTS + ";"
应该是吗

String query = " SELECT SUM(" + COLUMN_PRODUCTCOST + ") FROM " + TABLE_PRODUCTS + ";"
您应该更改:-

String query = " SELECT SUM(COLUMN_PRODUCTCOST) FROM " + TABLE_PRODUCTS + ";";
将来

否则查询将失败,因为没有名为column\u PRODUCTCOST的列,而是在解析column\u PRODUCTCOST时(即PRODUCTCOST)需要该值,这是一个列名

您可能还希望考虑使用便利方法而不是使用<强> RWQualue/Stult>方法。< /P> 您的代码可以是:-

public int GetTotal(){
    int temp;
    SQLiteDatabase db = getWritableDatabase();
    String[] columns = new String[]{"SELECT SUM(" + COLUMN_PRODUCTCOST + ")"}
    Cursor cursor = db.query(TABLE_PRODUCTS,columns,null,null,null,null,null);
    if (cursor.moveToFirst()) {
        temp = cursor.getInt(0);
    }
    else temp = 0; //<<<<<<<<<< CHANGED not to return as the Cursor would not be closed.
    cursor.close();
    return temp;
}
public int GetTotal(){
内部温度;
SQLiteDatabase db=getWritableDatabase();
字符串[]列=新字符串[]{“选择和(“+COLUMN\u PRODUCTCOST+”)”}
Cursor Cursor=db.query(表产品、列、null、null、null、null、null);
if(cursor.moveToFirst()){
temp=cursor.getInt(0);
}

else temp=0;/@TavisHicks注意编辑和关闭光标(如果您坚持这样做,可以/应该应用于rawQuery),因为即使没有行的光标也应该关闭)。我建议您查看Google的Room Persistence Library,这是新引入的与SQLite DB交互的更好方式。请看这里:
public int GetTotal(){
    int temp;
    SQLiteDatabase db = getWritableDatabase();
    String[] columns = new String[]{"SELECT SUM(" + COLUMN_PRODUCTCOST + ")"}
    Cursor cursor = db.query(TABLE_PRODUCTS,columns,null,null,null,null,null);
    if (cursor.moveToFirst()) {
        temp = cursor.getInt(0);
    }
    else temp = 0; //<<<<<<<<<< CHANGED not to return as the Cursor would not be closed.
    cursor.close();
    return temp;
}