[英]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. 由于
dbHelper
为null
时调用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.