1

I am developing one android app in which I want to store my employee details. I am unable to load data in ListView from Database.

DatabaseHelper.java

\\import statement 
 public class DatabaseHelper extends SQLiteOpenHelper{

    public static final String EMPLOYEE_ID = "EmployeeId";
    public static final String EMPLOYEE_NAME = "Name";
    public static final String EMPLOYEE_USERNAME = "Username";
    public static final String EMPLOYEE_PASSWORD = "Password";
    public static final String EMPLOYEE_MANGER_ID = "ManagerId";

    public static final String CREATE_TABLE_EMPLOYEE = "CREATE TABLE "+TABLE_NAME_EMPLOYEE+" ("+EMPLOYEE_ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+EMPLOYEE_NAME+" varchar(30), "+EMPLOYEE_USERNAME+" varchar(8), "+EMPLOYEE_PASSWORD+" varchar(10), "+EMPLOYEE_MANGER_ID+" Int);";

    public static final String DROP_TABLE_EMPLOYEE = "DROP TABLE "+TABLE_NAME_EMPLOYEE+" IF EXISTS";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.context = context;         
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        try {
            db.execSQL(CREATE_TABLE_EMPLOYEE);
        } catch (SQLException e) {
            //toast message
        }
        //toast message
    }

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

        try {
            db.execSQL(DROP_TABLE_EMPLOYEE);
            onCreate(db);
        } catch (SQLException e) {
            //toast message 
        }
        //toast message
    }   
}

I have another class for handling only employeetable such as inserting, deleting, etc i.e. EmployeeDatabaseHelper derived from DatabaseHelper.

EmployeeDatabaseHelper.java

\\import statement
public class EmployeeDatabaseHelper extends DatabaseHelper{

public EmployeeDatabaseHelper(Context context) {
    super(context); 
}

public Cursor getAllEmployee(){

    ArrayList<Employee> employeeArrayList = new ArrayList<Employee>();
    String sql = "select * from tblEmployee";
    SQLiteDatabase db = getWritableDatabase();
    Cursor cursor = db.rawQuery(sql, null);
    if (cursor.moveToFirst()) {
        do{
            Employee e  = new Employee();
            e.name = cursor.getString(cursor.getColumnIndex(EMPLOYEE_NAME));
            employeeArrayList.add(e);               
        } while (cursor.moveToNext());
    }       
    return cursor;  
}
}

EmployeeFragment in this section my code is wrong It is giving null pointer Exception. My application close when I open Employeefragment.

EmployeeFragment.java

public class EmployeeFragment extends Fragment {

EmployeeDatabaseHelper dbHelper;
ListView employeeList;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_employee, container, false);
    employeeList = (ListView) rootView.findViewById(R.id.employeeList);
    populateEmployeeList();
    return rootView;
}

public void populateEmployeeList(){

    Cursor cursor = dbHelper.getAllEmployee();
    String[] data = new String[] {dbHelper.EMPLOYEE_ID, dbHelper.EMPLOYEE_NAME};
    int[] id = new int[] {R.id.mainTextView, R.id.subTextView};
    SimpleCursorAdapter myAdapter = new SimpleCursorAdapter(getActivity(), R.layout.row, cursor, data, id);
    employeeList.setAdapter(myAdapter);

}
}

And Employee.java is my another class

public class Employee {
 public String username;
 public String name;
 public String password;        
}

In row.xml I have nothing great only two textView. (ie mainTextView,subTextView) and In fragment_employee.xml I have one button to add new employee. and one list to view all employee. I stucked here. if I comment this populateEmployeeList() class then my program works. otherwise it get closed unexpectedly.

LOG cat

 FATAL EXCEPTION: main
  Process: com.threepin.deepakcorporation, PID: 9393
  java.lang.IllegalArgumentException: column '_id' does not exist
  at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303)
  at android.widget.CursorAdapter.init(CursorAdapter.java:172)
  at android.widget.CursorAdapter.<init>(CursorAdapter.java:120)
  at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:52)
  at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:78)
  at com.threepin.deepakcorporation.EmployeeFragment.populateEmployeeList(EmployeeFragment.java:61)
  at com.threepin.deepakcorporation.EmployeeFragment.onActivityCreated(EmployeeFragment.java:52)
  at android.app.Fragment.performActivityCreated(Fragment.java:1708)
  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:908)
  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
  at android.app.BackStackRecord.run(BackStackRecord.java:684)
  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
  at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
  at android.os.Handler.handleCallback(Handler.java:733)
  at android.os.Handler.dispatchMessage(Handler.java:95)
  at android.os.Looper.loop(Looper.java:136)
  at android.app.ActivityThread.main(ActivityThread.java:5127)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)
  at dalvik.system.NativeStart.main(Native Method)
1
  • 1
    In the future, please post your Java stack trace in your question. Also, do not perform database I/O on the main application thread. Commented Mar 31, 2015 at 11:22

4 Answers 4

4

Try to use populateEmployeeList() in onActivityCreated() method of fragment. Because as per your code, your view is not completed yet and you are trying to fill the listview by calling populateEmployeeList().

Sign up to request clarification or add additional context in comments.

4 Comments

and onActivityCreated() will call after onCreateView(). onCreateView() is responsible for building and inflating UI. So just cut populateEmployeeList() from onCreateView() and paste it into onActivityCreared()
ListView requires one of the retrieved columns to have the name _ID. you should have to use _ID column while creating the table. use this link for info developer.android.com/guide/topics/providers/… and read the first point of Data design considerations section.
I have Employee_ID column in that table and List also have that column
_ID is needed when you use the SimpleCursorAdapter... If you use BaseAdapter then you dont need it. Try to fill listview using BaseAdapter
3

Column _id does not exist, just read your error carefully. You have to take the _id field:

@Override
public void onCreate(SQLiteDatabase paramSQLiteDatabase) {
    String sql="CREATE TABLE tableEQ (_ID INTEGER PRIMARY KEY," ...

}

3 Comments

I have column Employee_id will it do. or I need only _id.
_id is the base column
_id is useful when you are using the enhanced Adapters which make use of a Cursor . It's used by these adapters to provide an ID which can be used to refer to the specific row in the table which relates the the item in whatever the adapter is being used for e.g. a row in a ListView. check this link sqlite.org
2

if I comment this populateEmployeeList() class then my program works. otherwise it get closed unexpectedly

Because dbHelper is null when calling getAllEmployee method from EmployeeDatabaseHelper class.

To fix issue, create object of EmployeeDatabaseHelper class by passing Context in class constructor before using dbHelper object to access methods from class:

 dbHelper=new EmployeeDatabaseHelper(getActivity());
 Cursor cursor = dbHelper.getAllEmployee();

Comments

0

I have changed my code. Its running. I don't know it will help others or not but still.

No changes in DatabaseHelper.java

EmployeeDatabaseHelper.java

public class EmployeeDatabaseHelper {
DatabaseHelper dbhelper;

public EmployeeDatabaseHelper(Context applicationContext) {
    dbhelper= new DatabaseHelper(applicationContext);
}

public long insertEmployee(String name, String username, String password){
    SQLiteDatabase db = dbhelper.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(EMPLOYEE_NAME,name);
    cv.put(EMPLOYEE_USERNAME,username);
    cv.put(EMPLOYEE_PASSWORD,password);
    long id = db.insert(TABLE_NAME_EMPLOYEE, null, cv);
    db.close();
    return id;      
}

public ArrayList<Employee> getAllEmployee(){

    ArrayList<Employee> employeeArrayList = new ArrayList<Employee>();
    SQLiteDatabase db = dbhelper.getWritableDatabase();
    Cursor cursor = db.query(TABLE_NAME_EMPLOYEE, null,null,null,null,null,null);

        while (cursor.moveToNext()) {
            Employee e  = new Employee();
            e.name = cursor.getString(cursor.getColumnIndex(EMPLOYEE_NAME));
            e.username = cursor.getString(cursor.getColumnIndex(EMPLOYEE_USERNAME));
            employeeArrayList.add(e);
        } 

    db.close();
    return employeeArrayList;
}
}

EmployeeFragment.java

public class EmployeeFragment extends Fragment {

EmployeeDatabaseHelper dbHelper;
ListView employeeList;
public Cursor employees;
private ArrayList<Employee> arrlst;
private myadapter myadapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_employee, container, false);

    employeeList = (ListView) rootView.findViewById(R.id.employeeList);
    return rootView;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    populateEmployeeList();
}

public void populateEmployeeList(){

    dbHelper=new EmployeeDatabaseHelper(getActivity());
     arrlst = dbHelper.getAllEmployee();
    myadapter = new myadapter(getActivity());
    employeeList.setAdapter(myadapter);

}

class myadapter extends ArrayAdapter<Employee>{
Activity con;
private LayoutInflater Inflater;

public myadapter(Activity context) {
    super(context,R.layout.row);
    con=context;
     Inflater = (LayoutInflater)con.getSystemService(con.LAYOUT_INFLATER_SERVICE);
}

class ViewHolder{
    TextView tvid;
    TextView tvname;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View vi = convertView;
     ViewHolder vh;
    if(vi==null){
        vh = new ViewHolder();
        vi= Inflater.inflate(R.layout.row, null);
        vh.tvid=(TextView)vi.findViewById(R.id.mainTextView);

        vh.tvname=(TextView)vi.findViewById(R.id.subTextView);
        vi.setTag(vh);

    }else{
        vh=(ViewHolder)vi.getTag();
    }
    Employee e =arrlst.get(position);
    vh.tvid.setText(e.name);
    vh.tvname.setText(e.username);
    return vi;
}
@Override
public int getCount() {
    // TODO Auto-generated method stub
    return arrlst.size();
}
}
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.