java - 单击 ListView 中的项目时,Android 应用程序崩溃

标签 java android database sqlite

我的应用执行以下操作:

-输入员工姓名,点击搜索按钮。

-作为结果的匹配名称列表。

-点击其中一个结果名称。

-一个新的 Activity 打开,点击的名字,它的标题,电话,显示的电子邮件数据。

但是,当我单击其中一个结果名称时,我的应用程序崩溃了,它没有显示任何错误。

这是我到目前为止所做的。

    public class MainActivity extends Activity
    {    
    EditText name;
    ArrayAdapter<String> nameAdapter;
    DeptDPHelper Emp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Button Search = (Button)findViewById(R.id.Search);

        name = (EditText)findViewById(R.id.name);
        final ListView namelist = (ListView)findViewById(R.id.LV);

        nameAdapter = new ArrayAdapter<>(getApplicationContext() , android.R.layout.simple_list_item_1);
        namelist.setAdapter(nameAdapter);

        Emp = new DeptDPHelper(getApplicationContext());
        //Inserting some data into database
        Emp.InsertEmp("AhmedMhmmd" , "010224455" , "gg@jj.com" , "xx");
        Emp.InsertEmp("MhmmdMhmoud" , "010224455" , "gg@jj.com" , "xx");
        Emp.InsertEmp("Ahmedxxx" , "010224455" , "gg@jj.com" , "xx");
        Emp.InsertDept("Finance");
        Emp.InsertDept("Sales");
        //Search button
        Search.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v) {
                Cursor cur = Emp.GetEmpname(name.getText().toString());
                nameAdapter.clear();

                if(cur != null)
                {
                    while(!cur.isAfterLast())
                    {
                        //Toast.makeText(getApplicationContext() , "Error" , Toast.LENGTH_LONG).show();
                        nameAdapter.add(cur.getString(0));
                        cur.moveToNext();
                        //nameAdapter.add("gg");
                    }
                }

                else
                {
                    Toast.makeText(getApplicationContext() , "ErrOooor" , Toast.LENGTH_LONG).show();
                }
            }
        });
            //When clicking a name from the list of results.
          namelist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
              @Override
              public void onItemClick(AdapterView<?> parent, View view, int position, long id)
              {
                  String name = namelist.getItemAtPosition(position).toString(); //get the name
                  Cursor empID = Emp.getEmpID(name);  //pass the name to a method to get its ID
                  Cursor DepID = Emp.getDeptID(name);
                  empID.moveToFirst();
                  DepID.moveToFirst();
                  int eID = empID.getInt(0); //Converting ID into Integer
                  int dID = DepID.getInt(0);


                  Intent intent = new Intent(MainActivity.this, empDetails.class);
                  intent.putExtra("empName", Emp.getEmpData(eID).toString()); //getting value of name using ID
                  intent.putExtra("empTitle",Emp.getEmpData(eID).toString());
                  intent.putExtra("empPhone",Emp.getEmpData(eID).toString());
                  intent.putExtra("empEmail",Emp.getEmpData(eID).toString());
                  intent.putExtra("empDept",Emp.getDeptName(dID).toString());
                  startActivity(intent);
              }
          });
    }
  //SQLITE Part
    public static class DeptDPHelper extends SQLiteOpenHelper {
        SQLiteDatabase EmpDept;

        public DeptDPHelper(Context context) {
            super(context, "EmpDept", null, 2);
        }

        @Override
        public void onCreate(SQLiteDatabase db)
        {
            db.execSQL("create table department(DeptID integer primary key autoincrement , name text);");
            db.execSQL("create table Employee (EmpID integer primary key autoincrement , name text not null," +
                    "Title text not null , phone text not null , email text not null ," +
                    "DeptID integer, foreign key(DeptID) references department (DeptID))");

            //ContentValues row = new ContentValues();
            //db.execSQL("insert into Employee (EmpID , name , Title , phone , email ) values ('Ahmemhmmd' , '010224455' , 'gg@jj.com' , 'xx')");

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("drop table if exists department ");
            db.execSQL("drop table if exists Employee ");
            onCreate(db);
        }

        public void InsertEmp (String Empname, String phone, String Email, String title)
        {
            ContentValues roww = new ContentValues();
            //roww.put("Id",empID );
            roww.put("name", Empname);
            roww.put("Title", title);
            roww.put("phone", phone);
            roww.put("Email", Email);

            EmpDept = getWritableDatabase();
            EmpDept.insert("Employee ", null, roww);
            EmpDept.close();
        }

        public void InsertDept(String Deptname)
        {
            ContentValues row = new ContentValues();
            //row.put("Id", DeptID);
            row.put("name", Deptname);
            EmpDept = getWritableDatabase();
            EmpDept.insert("department ", null, row);
            EmpDept.close();
        }

        public Cursor GetEmpname(String namee)
        {
            EmpDept = getReadableDatabase();
            String[] arg = {namee};
            Cursor cur = EmpDept.rawQuery("select name from employee where name like ?;", new String[]{"%"+namee+"%"});
            cur.moveToFirst();
            EmpDept.close();
            return cur;
        }


        public Cursor Fetchallemployee() {
            EmpDept = getReadableDatabase();
            String[] rowdetails = {"name"};
            Cursor cursor = EmpDept.query("employee", rowdetails, null
                    , null, null, null, null);
            if (cursor != null) {
                cursor.moveToFirst();
            }
            EmpDept.close();
            return cursor;
        }
        //This method in order to get the employee id using the clicked name
        public Cursor getEmpID(String nameList)
        {
            EmpDept = getReadableDatabase();
            String[] rowID = {nameList};
            Cursor cursor = EmpDept.rawQuery("select EmpID from Employee where name like ?",rowID);
            EmpDept.close();
            if (cursor != null)
            {
                cursor.moveToFirst();
            }
            return cursor;
        }
        public Cursor getDeptID(String nameList)
        {
            EmpDept = getReadableDatabase();
            String[] rowwID = {nameList};
            Cursor curr = EmpDept.rawQuery("select DeptID from department inner join Employee on department.DeptID = Employee.DeptID where Employee.name like ? ",rowwID);
            //department d inner join Employee e on d.DeptID = e.DeptID where e.name like ?
            if (curr != null)
            {
                curr.moveToFirst();
            }
            EmpDept.close();
            return curr;
        }
    //This method for returning employee data using employee id as an input
        public Cursor getEmpData(Integer employeeID)
        {
            EmpDept = getReadableDatabase();
           // String[] empRow = {"name", "title", "phone", "Email"};
            //String[] arg = {name, title, phone, email};
            Integer[] empRow = {employeeID};
            //Cursor c = EmpDept.query("Employee", empRow, null, null, null, null, null);
            Cursor c = EmpDept.rawQuery("Select name, Title, phone, email from Employee where EmpID like ?", new String[]{employeeID.toString()});
            if (c != null)
            {
                c.moveToFirst();
            }
            EmpDept.close();
            return c;
        }
        public Cursor getDeptName(Integer departmentID)
        {
            EmpDept = getReadableDatabase();
            Integer[] deptRow = {departmentID};
            //Cursor cr = EmpDept.rawQuery("Select name from department d inner join Employee e on d.DeptID = e.DeptID where e.name like ?",new String[]{deptartmentID.toString()});
            Cursor cr = EmpDept.rawQuery("Select name from department where DeptID like ?",new String[]{departmentID.toString()});
            if (cr != null)
            {
                cr.moveToFirst();
            }
            EmpDept.close();
            return cr;

        }
    }
}

当我输入一个名字并点击搜索按钮时,它起作用了,我得到了名字列表,但是当我点击其中一个名字时,它崩溃了。

这里出了什么问题?

这是我的日志:

11-27 04:39:48.835 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:39:48.835 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:39:58.905 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:39:58.905 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:40:08.975 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:40:08.975 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:40:09.665 704-1339/? E/Watchdog: !@Sync 6712 [11-27 04:40:09.670]
11-27 04:40:10.695 13974-13989/? E/ContactsProvider_EventLog: Flush buffer to file cnt : 1 size : 0Kb duration : 1ms lastUpdatedAfter : 60117 ms mFlush_time_threasold : 2000 mCurrentSize : 294
11-27 04:40:19.045 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:40:19.045 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:40:21.025 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:21.025 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:21.275 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:21.315 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:21.315 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:21.315 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:21.435 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:21.435 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:21.495 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:21.595 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:21.655 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:21.705 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:21.775 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:21.775 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:21.895 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:21.955 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:22.015 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:22.035 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:22.035 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:22.045 220-225/? E/Tzdaemon: [w2] pthread_setaffinity_np() failed: 22
11-27 04:40:29.095 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:712,format:0
11-27 04:40:29.095 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:712,format:0
11-27 04:40:30.465 3733-3733/? E/AffinityControl: AffinityControl: registerfunction enter
11-27 04:40:39.175 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:40:39.175 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:40:39.235 2767-2767/? E/MtpServerJNI: server is null in send_object_removed
11-27 04:40:39.665 704-1339/? E/Watchdog: !@Sync 6713 [11-27 04:40:39.672]
11-27 04:40:49.245 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:40:49.245 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:40:59.315 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:40:59.315 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:41:09.385 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:41:09.385 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:41:09.665 704-1339/? E/Watchdog: !@Sync 6714 [11-27 04:41:09.673]
11-27 04:41:10.825 13974-13989/? E/ContactsProvider_EventLog: Flush buffer to file cnt : 1 size : 0Kb duration : 2ms lastUpdatedAfter : 60131 ms mFlush_time_threasold : 2000 mCurrentSize : 294
11-27 04:41:19.465 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:41:19.465 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:41:29.535 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:41:29.535 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:41:29.775 704-876/? E/MARsDBManager: updateDBAll : begin --size 1
11-27 04:41:29.815 704-876/? E/MARsDBManager: updateDBAll : end
11-27 04:41:39.605 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:41:39.605 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:41:39.665 704-1339/? E/Watchdog: !@Sync 6715 [11-27 04:41:39.674]
11-27 04:41:49.675 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:41:49.675 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:41:59.745 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:41:59.745 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:42:09.665 704-1339/? E/Watchdog: !@Sync 6716 [11-27 04:42:09.675]
11-27 04:42:09.815 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:42:09.815 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:42:10.955 13974-13989/? E/ContactsProvider_EventLog: Flush buffer to file cnt : 1 size : 0Kb duration : 3ms lastUpdatedAfter : 60123 ms mFlush_time_threasold : 2000 mCurrentSize : 294
11-27 04:42:19.895 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:42:19.895 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:42:29.965 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:42:29.965 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:42:38.625 1547-32615/? E/Places: ?: Exceeded maximum network back off time, fetching nearby places failed with status: 7
11-27 04:42:39.665 704-1339/? E/Watchdog: !@Sync 6717 [11-27 04:42:39.676]
11-27 04:42:40.035 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:42:40.035 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:42:50.105 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:42:50.105 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:43:00.175 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:43:00.175 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:43:09.675 704-1339/? E/Watchdog: !@Sync 6718 [11-27 04:43:09.678]
11-27 04:43:10.245 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:43:10.245 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:43:11.065 13974-13989/? E/ContactsProvider_EventLog: Flush buffer to file cnt : 1 size : 0Kb duration : 1ms lastUpdatedAfter : 60110 ms mFlush_time_threasold : 2000 mCurrentSize : 294
11-27 04:43:20.315 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:43:20.315 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:43:30.395 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:43:30.395 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:43:39.675 704-1339/? E/Watchdog: !@Sync 6719 [11-27 04:43:39.679]
11-27 04:43:40.465 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:43:40.465 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:43:50.535 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:43:50.535 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:44:00.605 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:44:00.605 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:44:09.675 704-1339/? E/Watchdog: !@Sync 6720 [11-27 04:44:09.680]
11-27 04:44:10.675 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:44:10.675 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:44:11.185 13974-13989/? E/ContactsProvider_EventLog: Flush buffer to file cnt : 1 size : 0Kb duration : 1ms lastUpdatedAfter : 60116 ms mFlush_time_threasold : 2000 mCurrentSize : 294
11-27 04:44:20.745 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:44:20.745 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:44:30.815 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:44:30.815 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:44:39.675 704-1339/? E/Watchdog: !@Sync 6721 [11-27 04:44:39.681]
11-27 04:44:40.895 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:44:40.895 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:44:50.965 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:44:50.965 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:45:01.035 326-1009/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0
11-27 04:45:01.035 217-291/? E/NetlinkEvent: NetlinkEvent::decode(): buffer'change@/devices/battery/power_supply/battery' size:713,format:0

这是我的 empDetails Activity 代码:

public class empDetails extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_emp_details);
        TextView name = (TextView)findViewById(R.id.textView7);
        TextView title = (TextView)findViewById(R.id.textView8);
        TextView phone = (TextView)findViewById(R.id.textView9);
        TextView email = (TextView)findViewById(R.id.textView10);
        TextView dept = (TextView)findViewById(R.id.textView11);
        name.setText(getIntent().getExtras().getString("empName"));
        title.setText(getIntent().getExtras().getString("empTitle"));
        phone.setText(getIntent().getExtras().getString("empPhone"));
        email.setText(getIntent().getExtras().getString("empEmail"));
        dept.setText(getIntent().getExtras().getString("empDept"));

    }
}

当我调试时,调试器部分什么都不显示,控制台部分的一部分显示如下:

    --------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.fatma.assgnment004, PID: 2580
    java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.
        at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(SQLiteConnectionPool.java:962)
        at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:599)
        at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:348)
        at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:894)
        at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:834)
        at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
        at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:143)
        at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:132)
        at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:219)
        at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:258)
        at com.example.fatma.assgnment004.MainActivity$DeptDPHelper.getEmpID(MainActivity.java:182)
        at com.example.fatma.assgnment004.MainActivity$2.onItemClick(MainActivity.java:77)
        at android.widget.AdapterView.performItemClick(AdapterView.java:310)
        at android.widget.AbsListView.performItemClick(AbsListView.java:1156)
        at android.widget.AbsListView$PerformClick.run(AbsListView.java:3121)
        at android.widget.AbsListView.onTouchUp(AbsListView.java:4048)
        at android.widget.AbsListView.onTouchEvent(AbsListView.java:3807)
        at android.view.View.dispatchTouchEvent(View.java:10023)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2626)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2307)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
        at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:413)
        at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1808)
        at android.app.Activity.dispatchTouchEvent(Activity.java:3061)
        at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:375)
        at android.view.View.dispatchPointerEvent(View.java:10243)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4438)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4306)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3906)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3872)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3999)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3880)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4056)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3906)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3872)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3880)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6246)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6220)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6181)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6349)
E/AndroidRuntime:     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:323)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Disconnected from the target VM, address: 'localhost:8647', transport: 'socket'

最佳答案

已编辑

已添加到问题的堆栈跟踪中有一行内容为

java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.

这表示连接(可能有一个数字,因此连接池)已关闭。连接是到数据库的连接。它已关闭,因为您已经使用 EmpDept.close() 专门关闭了它。

创建 Cursor 时,它实际上并不包含数据,而是在需要数据时从数据库中读取数据。如果数据库已关闭,则无法获取数据。

例如你有:-

        cur.moveToFirst();
        EmpDept.close(); //<<<<<<<<<< Database connection closed
        return cur;

简而言之,您不能关闭数据库连接然后访问 Cursor 中的数据。

这是一个完整的工作解决方案,不包括上述缺陷或其他缺陷(一些由评论指出)。

首先在 Employee.java

中创建一个名为 Employee 的新类
public class Employee {

    private long employeeId;
    private String employeeName;
    private String employeeTitle;
    private String employeePhone;
    private String employeeEmail;
    private long employeeDeptId;
    private String employeeDeptName;

    public Employee(
            long id,
            String name,
            String title,
            String phone,
            String email,
            long deptid,
            String deptname
    ) {
        this.employeeId = id;
        this.employeeName = name;
        this.employeeTitle = title;
        this.employeePhone = phone;
        this.employeeEmail = email;
        this.employeeDeptId = deptid;
        this.employeeDeptName = deptname;
    }

    public Employee() {
        this(-1L,"","","","",-1L,"");
    }

    public Employee(String name, String title, String phone, String email) {
        this(-1L,name,title,phone,email,-1L,"");
    }

    public long getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(long employeeId) {
        this.employeeId = employeeId;
    }

    public String getEmployeeName() {
        return employeeName;
    }

    public void setEmployeeName(String employeeName) {
        this.employeeName = employeeName;
    }

    public String getEmployeeTitle() {
        return employeeTitle;
    }

    public void setEmployeeTitle(String employeeTitle) {
        this.employeeTitle = employeeTitle;
    }

    public String getEmployeePhone() {
        return employeePhone;
    }

    public void setEmployeePhone(String employeePhone) {
        this.employeePhone = employeePhone;
    }

    public String getEmployeeEmail() {
        return employeeEmail;
    }

    public void setEmployeeEmail(String employeeEmail) {
        this.employeeEmail = employeeEmail;
    }

    public long getEmployeeDeptId() {
        return employeeDeptId;
    }

    public void setEmployeeDeptId(long employeeDeptId) {
        this.employeeDeptId = employeeDeptId;
    }

    public String getEmployeeDeptName() {
        return employeeDeptName;
    }

    public void setEmployeeDeptName(String employeeDeptName) {
        this.employeeDeptName = employeeDeptName;
    }

    public boolean ifFullyUseableEmployee() {
         return this.employeeId < 1 || this.employeeDeptId < 1 || this.employeeDeptName.length() < 1;
    }

    @Override
    public String toString() {
        return this.employeeTitle + " " + this.employeeName;
    }
}

可能是 DatabaseHelper 的新类,即 DeptDPhelper.java

public class DeptDPHelper extends SQLiteOpenHelper {

    SQLiteDatabase EmpDept;

    //<<<<<<<<<< BAD PRACTICE TO HARD CODE TABLE AND COLUMN NAMES THROUGHOUT >>>>>>>>>>
    //<<<<<<<<<< INSTEAD USE CONSTANTS                                       >>>>>>>>>>>

    public static final String DBNAME = "EmpDept";
    public static final int DBVERSION = 2;
    public static final String DEPARTMENT_TABLE = "department";
    public static final String EMPLOYEE_TABLE = "employee"; //<<<<<<<<<< not Employee to be consistent with naming connvention

    public static final String DEPARTMENT_DEPTID_COLUMN = "departmenttid";
    public static final String DEPARTMENT_NAME_COLUMN = "departmentname";

    public static final String EMPLOYEE_EMPID_COLUMN = "employeeid";
    public static final String EMPLOYEE_NAME_COLUMN = "employeename";
    public static final String EMPLOYEE_TITLE_COLUMN= "employeetitle";
    public static final String EMPLOYEE_PHONE_COLUMN = "employeephone";
    public static final String EMPLOYEE_EMAIL_COLUMN = "employeeemail";
    public static final String EMPLOYEE_DEPT_COLUMN = "employeeedepartmentid";

    public DeptDPHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
        EmpDept = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String crt_dept_table_sql = "CREATE TABLE IF NOT EXISTS " + DEPARTMENT_TABLE + "(" +
                DEPARTMENT_DEPTID_COLUMN + " INTEGER PRIMARY KEY, " + //<<<<<<<<<< AUTOINCREMENT INEFFICIENT NOT NEEDED
                DEPARTMENT_NAME_COLUMN + " TEXT" +
                ")";
        db.execSQL(crt_dept_table_sql);

        String crt_employee_table_sql = "CREATE TABLE IF NOT EXISTS " + EMPLOYEE_TABLE + "(" +
                EMPLOYEE_EMPID_COLUMN + " INTEGER PRIMARY KEY, " +
                EMPLOYEE_NAME_COLUMN + " TEXT NOT NULL, " +
                EMPLOYEE_TITLE_COLUMN + " TEXT NOT NULL, " +
                EMPLOYEE_PHONE_COLUMN + " TEXT NOT NULL, " +
                EMPLOYEE_EMAIL_COLUMN + " TEXT NOT NULL, " +
                EMPLOYEE_DEPT_COLUMN + " INTEGER REFERENCES " + DEPARTMENT_TABLE + "(" +
                DEPARTMENT_DEPTID_COLUMN +
                ")" +
                ")";
        db.execSQL(crt_employee_table_sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        //<<<<<<<<<< IF USING FOREIGN KEYS AND SUPPORT IS ON THEN CANNOT DELETE PARENT TABLE FIRST >>>>>>>>>>
        //<<<<<<<<<< AS SUCH DEPARTMENT TABLE MUST BE DROPPED FIRST OTHEWISE THERE WILL BE CONFLICTS >>>>>>>>>>
        db.execSQL("DROp TABLE IF EXISTS " + EMPLOYEE_TABLE);
        db.execSQL("DROP TABLE IF EXISTS " + DEPARTMENT_TABLE);
        onCreate(db);
    }

    //<<<<<<<<<< FOREIGN KEY SUPPORT IS TUREND OFF BY DEFAULT SO TURN THEM ON >>>>>>>>>>
    //<<<<<<<<<< IF NOT USELESS CODING FOREIGN KEYS                           >>>>>>>>>>
    @Override
    public void onConfigure(SQLiteDatabase db) {
        db.setForeignKeyConstraintsEnabled(true);
        super.onConfigure(db);
    }

    public long insertEmployee(String name, String title, String phone, String email, long deptid) {
        //<<<<<<<<<< optional check if deptid references a deptartment >>>>>>>>>>
        //<<<<<<<<<< however INSERT OR IGNORE doesn't ignore FK conflicts >>>>>>>>>>
        if (!ifDepertmentExists(deptid)) return -1;

        ContentValues cv = new ContentValues();
        cv.put(EMPLOYEE_NAME_COLUMN,name);
        cv.put(EMPLOYEE_TITLE_COLUMN,title);
        cv.put(EMPLOYEE_PHONE_COLUMN,phone);
        cv.put(EMPLOYEE_EMAIL_COLUMN,email);
        cv.put(EMPLOYEE_DEPT_COLUMN,deptid);
        return EmpDept.insert(EMPLOYEE_TABLE,name,cv);
    }

    public long insertDepartment(String name) {
        ContentValues cv = new ContentValues();
        cv.put(DEPARTMENT_NAME_COLUMN,name);
        return EmpDept.insert(DEPARTMENT_TABLE,null,cv);
    }

    public Cursor selectLikeEmployeesByNamePart(String namepart) {
        String[] columns = new String[]{EMPLOYEE_NAME_COLUMN};
        String whereclause = EMPLOYEE_NAME_COLUMN + "LIKE ?";
        String[] whereargs = new String[] {"%" + namepart +"%"};
        return EmpDept.query(EMPLOYEE_TABLE,columns,whereclause,whereargs,null,null,EMPLOYEE_NAME_COLUMN);
    }

    public ArrayList<Employee> getAllEmployees(String namepart) {
        ArrayList<Employee> employees = new ArrayList<>();
        String whereclause = null;
        String[] wherargs = null;
        if (namepart != null && namepart.length() > 0) {
            whereclause = EMPLOYEE_NAME_COLUMN + " LIKE ?";
            wherargs = new String[]{"%" + namepart + "%"};
        }
        Cursor csr = EmpDept.query(EMPLOYEE_TABLE + " JOIN " + DEPARTMENT_TABLE + " ON " + EMPLOYEE_DEPT_COLUMN + "=" + DEPARTMENT_DEPTID_COLUMN,
                    null,whereclause, wherargs, null, null, EMPLOYEE_NAME_COLUMN + "," + EMPLOYEE_DEPT_COLUMN);
        while (csr.moveToNext()) {
            employees.add( new Employee(
                    csr.getLong(csr.getColumnIndex(EMPLOYEE_EMPID_COLUMN)),
                    csr.getString(csr.getColumnIndex(EMPLOYEE_NAME_COLUMN)),
                    csr.getString(csr.getColumnIndex(EMPLOYEE_TITLE_COLUMN)),
                    csr.getString(csr.getColumnIndex(EMPLOYEE_PHONE_COLUMN)),
                    csr.getString(csr.getColumnIndex(EMPLOYEE_EMAIL_COLUMN)),
                    csr.getLong(csr.getColumnIndex(DEPARTMENT_DEPTID_COLUMN)),
                    csr.getString(csr.getColumnIndex(DEPARTMENT_NAME_COLUMN)))
            );
        }
        csr.close();
        return employees;
    }


    private boolean ifDepertmentExists(long deptid) {
        String wherecluase = DEPARTMENT_DEPTID_COLUMN + "=?";
        String[] whereargs = new String[]{String.valueOf(deptid)};
        Cursor csr =EmpDept.query(DEPARTMENT_TABLE,null,wherecluase,whereargs,null,null,null);
        int rowcount = csr.getCount();
        csr.close();
        return rowcount > 0;
    }
}
  • 添加了一些评论,应该可以解释一些事情。

empDetails Activity 即empDetails.java

public class empDetails extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_emp_details);
        TextView name = (TextView)findViewById(R.id.textview7);
        TextView title = (TextView)findViewById(R.id.textview8);
        TextView phone = (TextView)findViewById(R.id.textview9);
        TextView email = (TextView)findViewById(R.id.textview10);
        TextView dept = (TextView)findViewById(R.id.textview11);
        Button mDoneButton = this.findViewById(R.id.donebutton);
        mDoneButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
        name.setText(getIntent().getExtras().getString(DeptDPHelper.EMPLOYEE_NAME_COLUMN));
        title.setText(getIntent().getExtras().getString(DeptDPHelper.EMPLOYEE_TITLE_COLUMN));
        phone.setText(getIntent().getExtras().getString(DeptDPHelper.EMPLOYEE_PHONE_COLUMN));
        email.setText(getIntent().getExtras().getString(DeptDPHelper.EMPLOYEE_EMAIL_COLUMN));
        dept.setText(getIntent().getExtras().getString(DeptDPHelper.DEPARTMENT_NAME_COLUMN));
    }
}

最后是MainActivity.java

public class MainActivity extends AppCompatActivity {

    DeptDPHelper mDBHlpr;
    ArrayList<Employee> mEmployeeList;
    ArrayAdapter mNameAdapter;
    ListView namelist;
    EditText mNamePart;
    TextWatcher mTW;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        namelist = this.findViewById(R.id.namelist);
        mNamePart = this.findViewById(R.id.searchbar);
        mDBHlpr = new DeptDPHelper(this);
        addSomeData();
        setupOrRefreshNameList();
        setupSearch();
    }

    private void setupOrRefreshNameList() {
        String namepart = mNamePart.getText().toString();
        if (namepart.length() < 1) namepart = null;
        if (mEmployeeList != null) {
            mEmployeeList.clear();
            ArrayList<Employee> el = mDBHlpr.getAllEmployees(namepart);
            mEmployeeList.addAll(el);
        } else {
            mEmployeeList = mDBHlpr.getAllEmployees(namepart);
        }
        if (mNameAdapter == null) {
            mNameAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,mEmployeeList);
            namelist.setAdapter(mNameAdapter);
            setupListViewListeners();
        } else {
            mNameAdapter.notifyDataSetChanged();
        }
    }

    //<<<<<<<<<< For testing >>>>>>>>>>
    private void addSomeData() {
        long dept1 = mDBHlpr.insertDepartment("Dept001");
        long dept2 = mDBHlpr.insertDepartment("Dept002");

        mDBHlpr.insertEmployee("Fred","Mr.","1234567890","fred.x.com",dept1);
        mDBHlpr.insertEmployee("Fred","Mr.","0987654321","fred@z.com",dept2);
        mDBHlpr.insertEmployee("Mary","Ms.","9999999999","mary@marymail.net",dept1);
        mDBHlpr.insertEmployee("Albert","Sir ", "1113334445","lord@roayls.org",dept1);
    }

    private void setupListViewListeners() {
        namelist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Employee e = (Employee) mNameAdapter.getItem(i);
                Toast.makeText(
                        getApplicationContext(),
                        "You clicked on " +
                                e.getEmployeeTitle() + " " +
                                e.getEmployeeName() +
                                " ID=" + String.valueOf(e.getEmployeeId()) +
                                " Email=" + e.getEmployeeEmail() +
                                " Phone=" + e.getEmployeePhone() +
                                " Dept=" + e.getEmployeeDeptName()
                        ,
                        Toast.LENGTH_SHORT)
                        .show();
                Intent intent = new Intent(MainActivity.this,empDetails.class);
                intent.putExtra(DeptDPHelper.EMPLOYEE_NAME_COLUMN,e.getEmployeeName());
                intent.putExtra(DeptDPHelper.EMPLOYEE_EMPID_COLUMN,e.getEmployeeId());
                intent.putExtra(DeptDPHelper.EMPLOYEE_TITLE_COLUMN,e.getEmployeeTitle());
                intent.putExtra(DeptDPHelper.EMPLOYEE_PHONE_COLUMN,e.getEmployeePhone());
                intent.putExtra(DeptDPHelper.EMPLOYEE_EMAIL_COLUMN,e.getEmployeeEmail());
                intent.putExtra(DeptDPHelper.DEPARTMENT_NAME_COLUMN,e.getEmployeeDeptName());
                startActivity(intent);
            }
        });
    }

    private void setupSearch() {
        mTW = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            //<<<<<<<<<< Every time the text is changed refresh the ListView >>>>>>>>>>
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                setupOrRefreshNameList();
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        };
        mNamePart.addTextChangedListener(mTW);
    }
}
  • 请注意,当您在 EditText 中输入文本时,这会动态更改列表

  • 注意 Mainifest 包含 <activity android:name=".empDetails"></activity>

第一次运行时你会得到:-

enter image description here

例如输入A(注意仅适用于名称而不适用于标题部分):-

enter image description here

点击玛丽:-

enter image description here

完成后会返回 MainActivity。

关于java - 单击 ListView 中的项目时,Android 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53491888/

相关文章:

mysql - 无法通过分区来改变查询时间

node.js - MongoDB 查询将一个记录值与另一记录值相减

java - 针对时间戳列的 Oracle SQL where 子句

java - ExpandableListView:从子项获取输入值

java - 如何从ListFragment发送数据到Fragment

Android AdView 泄漏,可能是由于某些内部后台线程

java - Spring 瓷砖应用程序:Error creating bean with name viewResolver defined in ServletContext resource

java - 当对象需要在 try/catch block 中时,IDE 的 "know"如何处理?

java - 如何避免在 Room Db 的表中重复输入数据?

mysql - 将生产数据库备份到从属数据库