Member 13131948 Ответов: 1

Передача элемента списка методу в sqlite android


Цитата:
Когда я ввожу имя сотрудника в поле поиска и нажимаю на кнопку "Поиск", соответствующие результаты отображаются в listview //My code does that part. И когда я нажимаю на одно из приведенных имен сотрудников из списка, оно должно переместить меня в новое действие, где отображаются имя, должность, телефон, электронная почта и отдел этого сотрудника.

Я застрял на получении идентификатора щелкнутого элемента части списка.

Это то, что я сделал до сих пор.


public class MainActivity extends Activity {

    EditText name; //Textbox to input name
    ArrayAdapter<String> nameAdapter;
    DeptDPHelper Emp;  //Database object

    @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());
        //Filling tables
        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");
        //When clicking on the 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();
                }
            }
        });


Цитата:
//Проблема отсюда, я хочу, когда я нажимаю на один из результатов поиска, чтобы перейти в новое действие с помощью намерения, где имя, название телефона, адрес электронной почты и отдел этого щелкнутого сотрудника отображаются там. Как я могу получить идентификатор щелкнутого имени и передать его методам getEmpData и getDeptName, чтобы я мог передать их значения новому действию?


Что я уже пробовал:

namelist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
              @Override
              public void onItemClick(AdapterView<?> parent, View view, int position, long id)
              {
  //This is where i'm stuck in
                  //int x = Integer.parseInt(namelist.getItemAtPosition(position).toString());

                  Intent i = new Intent(MainActivity.this, empDetails.class);
                   i.putExtra("empName", Emp.getEmpData(x));
                   i.putExtra("empTitle",Emp.getEmpData());
                   i.putExtra("empPhone",Emp.getEmpData());
                   i.putExtra("empEmail",Emp.getEmpData());
                   i.putExtra("empDept",Emp.getDeptName());
                  startActivity(i);
              }
          });
    }

//SQLITE
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);
        }
     //Inserting data in employee table
        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();
        }
  //Inserting data in department table
        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;
        }


//Selecting employee name, title, phone, email by inputting employee ID

 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;
        }

//Selecting department name by inputting department ID

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;

        }
    }
}

David Crow

Рассматривали ли вы возможность задать этот (длинный) вопрос на самом форуме Android? Этот раздел "Быстрые ответы" предназначен для гораздо более коротких вопросов и еще более коротких ответов.

Для краткости рассмотрим что-то вроде:

class EmpInfo
{
    String name;
    String title;
    String phone;
    String email;
    String dept;
}
...
ArrayAdapter<EmpInfo> nameAdapter = new ArrayAdapter<EmpInfo>(...);
...
while (! cur.isAfterLast())
{
    String name = cur.getString(0);
    String title = cur.getString(1);
    String phone = cur.getString(2);
    String email = cur.getString(3);
    String dept = cur.getString(4);
    nameAdapter.add(new EmpInfo(name, title, phone, email, dept));
    cur.moveToNext();
}
...
Intent i = new Intent(MainActivity.this, empDetails.class);
EmpInfo empInfo = nameAdapter.getItem(position);
i.putExtra("empName", empInfo.name);
i.putExtra("empTitle", empInfo.title);
i.putExtra("empPhone", empInfo.phone);
i.putExtra("empEmail", empInfo.email);
i.putExtra("empDept", empInfo.dept);

1 Ответов

Рейтинг:
2

TheOldFogie

При использовании ListView вместо того, чтобы пытаться построить несколько массивов для доступа к сохраненным значениям или использовать такие объекты, как объект Employee, используйте CursorAdapter все может быть гораздо проще.

Единственное осложнение (просто преодоленное) заключается в том, что адаптер Курсора требует определенного столбца с именем _идентификатор и что столбец содержит целочисленное значение, которое должно однозначно идентифицировать строку, которая указана в списке. Это значение передается событиям onItemClick и onItemLongClick в качестве 4-го параметра (*обратите внимание, что хотя значение передается для ArrayAdapters, это значение совпадает с позицией, но как long*), кроме того, базовый курсор расположен в соответствующей строке, так что все данные для выбранной строки легко получить.

SimpleCursorAdapter это, как говорится, CursorAdapter, который прост в использовании.

Даже при пользовательском макете в качестве 4-го и 5-го параметров используются имена столбцов (в виде строкового массива), из которых извлекаются отображаемые данные, и соответствующий идентификатор представления, в котором отображаются данные (в примере используется столбец name в качестве исходных данных для списка, отображаемого в макете who ' s id is the text1 view).

Поэтому я бы предложил рассмотреть следующий рабочий пример, который является адаптацией вашего кода.

DeptDBHelper.java (упрощенно, но важно получает _идентификатор колонка для адаптера Курсора)

public 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);
    }
    //Inserting data in employee table
    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(); 
    }
    //Inserting data in department table
    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(); // No need to close database - it's inefficient
    }

    /**
     * *********** This is all that you need to resolve your current issue
     */
    public Cursor getEmployeeData(String namee) {
        EmpDept = this.getWritableDatabase();
        return EmpDept.query(
                "employee",
                new String[]{
                        "*", //<<<<<<<<<< get all columns as you want all data eventually
                        "EmpID AS " + BaseColumns._ID //<<<<<<<<<< add column _id (copy of the EmpID) for CursorAdapter
                },
                "name LIKE ?",
                new String[]{"%" + namee + "%"},
                null,null,null
        );
    }

    //Selecting department name by inputting department ID

    // Mush simpler to just return the Cursor directly
    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()});
        return EmpDept.rawQuery("Select name from department where DeptID like ?",new String[]{departmentID.toString()});
        /*
        if (cr != null) // A Cursor will never be null when returned from an SQLitedatabase method, checking for null is useless
        {
            cr.moveToFirst();
        }
        EmpDept.close(); //closing database will make returned cursor unusable
        return cr;
        */
    }
}


MainActivity.java (использует SimpleCursorAdapter)

public class MainActivity extends Activity {

    EditText name; //Textbox to input name
    SimpleCursorAdapter nameAdapter; //<<<<<<<<<< CHANGED
    DeptDPHelper Emp;  //Database object
    Cursor csr; //<<<<<<<<<< ADDED

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Emp = new DeptDPHelper(this);
        addDataIfNone(); //<<<<<<<<< Add the data (just once)
        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);
        csr = Emp.getEmployeeData(name.getText().toString());
        nameAdapter = new SimpleCursorAdapter(this,android.R.layout.simple_list_item_2,csr,new String[]{"name"},new int[]{android.R.id.text1},0);
        namelist.setAdapter(nameAdapter);
        namelist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                String empName = csr.getString(csr.getColumnIndex("name"));
                String empTitle = csr.getString(csr.getColumnIndex("Title"));
                String empPhone = csr.getString(csr.getColumnIndex("phone"));
                String empEmail = csr.getString(csr.getColumnIndex("email"));
                //Note theorectically you should always get id's as long (rather than int) as they can be up to 64bit signed
                long empDept = csr.getLong(csr.getColumnIndex("DeptID"));
                Toast.makeText(view.getContext(),"You clicked on the Employee with an ID of " + String.valueOf(id) +
                                " Name is " + empName + " Title is " + empTitle + " Phone is " + empPhone + " Email is " + empEmail + " DeptID is " + String.valueOf(empDept),
                        Toast.LENGTH_SHORT).show();
                /* you would use 
                Intent i = new Intent(MainActivity.this, empDetails.class);
                i.putExtra("empName",empName );
                i.putExtra("empTitle",empTitle);
                i.putExtra("empPhone",empPhone);
                i.putExtra("empEmail",csr.getString(csr.getColumnIndex("email"))); // or get the data directly
                i.putExtra("empDept",csr.getLong(csr.getColumnIndex("DeptID")));
                startActivity(i);
                */
            }
        });
        //Filling tables moved

        //When clicking on the search button
        Search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                csr = Emp.getEmployeeData(name.getText().toString());
                nameAdapter.swapCursor(csr);
            }
        });
    }

    /**
     * Add data if no data already exists
     */
    private void addDataIfNone() {
        if (DatabaseUtils.queryNumEntries(Emp.getWritableDatabase(),"employee") > 0) return;
        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");
    }
}


При первом запуске список приложений состоит из 3 пунктов.
При нажатии на элемент тост-это все детали EmpID, имя, должность, телефон, электронная почта, DeptID.
Ввод текста в поиск и нажатие кнопки поиска обновляет список в соответствии с введенным текстом (например, x покажет только 1 строку, q не покажет никаких строк, A или a покажет 2 строки).


Graeme_Grant

5 объед ... должен был быть мой ответ, молодец!