我正在开发一个 Android 项目,管理员可以在该项目中向存储在数据库中的应用程序添加产品。其中产品编号 (p_no) 必须递增并显示在布局上。但是操作没有按预期执行,这里有一些我无法弄清楚的错误。
AddProduct.java:
package com.tyit.desertworld;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import java.io.File;
import java.io.InputStream;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class AddProduct extends AppCompatActivity implements View.OnClickListener {
Connection con;
int n = 1;
static EditText txt_pno, txt_name, txt_price,txt_desc,txt_filename;
String pno,name,price,desc,type;
Button b1,b2;
Spinner s;
Uri selectedImage;
InputStream iStream=null;
File source=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_product);
txt_pno = (EditText) findViewById(R.id.txt_pno);
txt_name = (EditText) findViewById(R.id.editText7);
txt_price = (EditText) findViewById(R.id.editText8);
txt_desc= (EditText) findViewById(R.id.editText9);
txt_filename= (EditText) findViewById(R.id.editText10);
s=(Spinner)findViewById(R.id.spinner);
String c[] = {"Cake", "Pastry"};
ArrayAdapter adapter1 = new ArrayAdapter(this, android.R.layout.simple_spinner_item, c);
adapter1.setDropDownViewResource(android.R.layout.simple_spinner_item);
s.setAdapter(adapter1);
b1 = (Button) findViewById(R.id.button2);
b1.setOnClickListener(this);
b2 = (Button) findViewById(R.id.button17);
b2.setOnClickListener(this);
DB_Conn1 obj=new DB_Conn1();
obj.execute();
}
public void onClick(View v) {
if(v.getId()==b1.getId()) {
name = txt_name.getText().toString();
price = txt_price.getText().toString();
desc = txt_desc.getText().toString();
pno=txt_pno.getText().toString().substring(12);
type=s.getSelectedItem().toString();
if (!name.isEmpty()) {
if (!price.isEmpty() && Integer.parseInt(price)>0) {
if (!desc.isEmpty()) {
DB_Conn obj = new DB_Conn();
obj.execute();
}
else {
txt_desc.setError("Value is required");
}
}
else {
txt_price.setError("Value not entered or invalid value entered");
}
}
else {
txt_name.setError("Value is required");
}
}
else{
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
startActivityForResult(i, 1);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data != null) {
Uri sel = data.getData();
try {
iStream = getContentResolver().openInputStream(sel);
String src = sel.getPath();
source = new File(Environment.getExternalStorageDirectory()+"/"+src);
txt_filename.setText(source.getName());
}
catch (Exception e){
e.printStackTrace();
}
}
}
class DB_Conn1 extends AsyncTask<Void,Void,String>
{
@Override
public String doInBackground(Void...arg) //compulsory to implement
{
String r="";
try {
SharedPreferences sp1 = getSharedPreferences("pf", Context.MODE_PRIVATE);
String userid=sp1.getString("userid", null);
con = DB_Connection.get_DBConnection();
PreparedStatement pst = con.prepareStatement("select max(pno) from products");
ResultSet rs = pst.executeQuery();
rs.next();
String v = rs.getString(1);
if (v != null) {
n = Integer.parseInt(v) + 1;
}
r = "success";
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return r;
}
@Override
public void onProgressUpdate(Void...arg0) //optional
{
}
@Override
public void onPostExecute(String result) //optional
{ // do something after execution
if(result.equals("success"))
{
txt_pno.setText("Product No: " + n);
}
}
@Override
public void onPreExecute() //optional
{
// do something before start
}
}
class DB_Conn extends AsyncTask<Void,Void,String>
{
@Override
public String doInBackground(Void...arg) //compulsory to implement
{
String r="";
try {
Connection con = DB_Connection.get_DBConnection();
PreparedStatement pst = con.prepareStatement("insert into products values(?,?,?,?,?,?)");
pst.setString(1, pno);
pst.setString(2, name);
pst.setString(3,desc);
pst.setString(4,type);
pst.setInt(5, Integer.parseInt(price));
pst.setBlob(6,iStream);
pst.execute();
r = "success";
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return r;
}
@Override
public void onProgressUpdate(Void...arg0) //optional
{
}
@Override
public void onPostExecute(String result) //optional
{
// do something after execution
if(result.equals("success"))
{
AlertDialog.Builder alert = new AlertDialog.Builder(AddProduct.this);
alert.setTitle("Success");
alert.setMessage("Product added successfully");
alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface obj, int x) {
AddProduct.this.finish();
}
});
AlertDialog alertDialog = alert.create();
alertDialog.show();
}
}
@Override
public void onPreExecute() //optional
{
// do something before start
}
}
}
activity_add_product.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="50px"
tools:context=".AddProduct">
<EditText
android:id="@+id/txt_pno"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:enabled="false"
android:textStyle="bold" />
<EditText
android:id="@+id/editText7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txt_pno"
android:layout_alignEnd="@+id/txt_pno"
android:layout_alignRight="@+id/txt_pno"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:hint="Enter Product name" />
<EditText
android:id="@+id/editText8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editText7"
android:layout_alignEnd="@+id/editText7"
android:layout_alignRight="@+id/editText7"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:ems="10"
android:hint="Enter Price"
android:inputType="numberSigned" />
<EditText
android:id="@+id/editText9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editText8"
android:layout_alignEnd="@+id/editText8"
android:layout_alignRight="@+id/editText8"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:gravity="top|left"
android:hint="Enter description"
android:inputType="textMultiLine"
android:lines="4" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="44dp"
android:text="Add" />
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/editText9"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true" />
<Button
android:id="@+id/button17"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignEnd="@+id/spinner"
android:layout_alignRight="@+id/spinner"
android:layout_alignBottom="@+id/editText10"
android:text="Select" />
<EditText
android:id="@+id/editText10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/spinner"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_toStartOf="@+id/button17"
android:layout_toLeftOf="@+id/button17"
android:focusable="false" />
</RelativeLayout>
这是将存储值的产品表的数据库结构
p_no的数据类型在数据库中是varchar,'n'的值是一个整数。此外,
pno=txt_pno.getText().toString().substring(12);
正在选择产品编号后的整数值:在txt_pno.setText("Product No: " + n);
我不明白为什么 'n' 的值没有递增并显示在屏幕上并抛出 StringIndexOutOfBoundsException length=0 index=12