简体   繁体   English

无法从Android中的数据库填充listView中的数据

[英]Unable to populate data in listView from Database in Android

I am developing one android app in which I want to store my employee details. 我正在开发一个Android应用程序,我想在其中存储我的员工详细信息。 I am unable to load data in ListView from Database. 我无法从数据库加载ListView中的数据。

DatabaseHelper.java 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 ie EmployeeDatabaseHelper derived from DatabaseHelper. 我还有另一个只处理employeetable的类,例如插入,删除等,即从DatabaseHelper派生的EmployeeDatabaseHelper。

EmployeeDatabaseHelper.java 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. EmployeeFragment在本节中我的代码是错误的,它给出了空指针Exception。 My application close when I open Employeefragment. 当我打开Employeefragment时,我的应用程序关闭。

EmployeeFragment.java 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 Employee.java是我的另一门课

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

In row.xml I have nothing great only two textView. row.xml中,只有两个textView没有什么好用的 (ie mainTextView,subTextView) and In fragment_employee.xml I have one button to add new employee. (即mainTextView,subTextView)和fragment_employee.xml中,我有一个按钮可以添加新员工。 and one list to view all employee. 一个列表以查看所有员工。 I stucked here. 我卡在这里。 if I comment this populateEmployeeList() class then my program works. 如果我评论此populateEmployeeList()类,则我的程序可以工作。 otherwise it get closed unexpectedly. 否则会意外关闭。

LOG cat LOG猫

 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)

Try to use populateEmployeeList() in onActivityCreated() method of fragment. 尝试在片段的onActivityCreated()方法中使用populateEmployeeList() Because as per your code, your view is not completed yet and you are trying to fill the listview by calling populateEmployeeList() . 因为按照您的代码,您的视图尚未完成,并且您正在尝试通过调用populateEmployeeList()来填充listview

Column _id does not exist, just read your error carefully. _id不存在,请仔细阅读错误。 You have to take the _id field: 您必须输入_id字段:

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

}

if I comment this populateEmployeeList() class then my program works. 如果我评论此populateEmployeeList()类,则我的程序可以工作。 otherwise it get closed unexpectedly 否则会意外关闭

Because dbHelper is null when calling getAllEmployee method from EmployeeDatabaseHelper class. 由于dbHelpernull时调用getAllEmployee从方法EmployeeDatabaseHelper类。

To fix issue, create object of EmployeeDatabaseHelper class by passing Context in class constructor before using dbHelper object to access methods from class: 要解决此问题,请在使用dbHelper对象访问类中的方法之前,通过在类构造函数中传递Context来创建EmployeeDatabaseHelper类的对象:

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

I have changed my code. 我已经更改了代码。 Its running. 它的运行。 I don't know it will help others or not but still. 我不知道它是否会帮助别人,但仍然会。

No changes in DatabaseHelper.java DatabaseHelper.java中没有更改

EmployeeDatabaseHelper.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 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();
}
}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM