【问题标题】:Unable to populate data in listView from Database in Android无法从 Android 的数据库中填充 listView 中的数据
【发布时间】:2015-03-31 11:21:03
【问题描述】:

我正在开发一个我想在其中存储我的员工详细信息的 Android 应用程序。我无法从数据库中加载 ListView 中的数据。

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

我有另一个类仅用于处理员工表,例如插入、删除等,即派生自 DatabaseHelper 的 EmployeeDatabaseHelper。

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 在这个部分我的代码是错误的它给出了空指针异常。当我打开 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);

}
}

Employee.java 是我的另一个类

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

row.xml 我没有什么了不起的只有两个 textView。 (即mainTextView,subTextView) 在 fragment_employee.xml 我有一个按钮来添加新员工。和一个查看所有员工的列表。我卡在这里。如果我评论这个 populateEmployeeList() 类然后我的程序工作。否则会意外关闭。

记录猫

 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)

【问题讨论】:

  • 以后,请在您的问题中发布您的 Java 堆栈跟踪。此外,不要在主应用程序线程上执行数据库 I/O。

标签: java android listview android-fragments simplecursoradapter


【解决方案1】:

尝试在片段的onActivityCreated() 方法中使用populateEmployeeList()。 因为根据您的代码,您的视图尚未完成,您正在尝试通过调用 populateEmployeeList() 来填充 listview

【讨论】:

  • 和 onActivityCreated() 将在 onCreateView() 之后调用。 onCreateView() 负责构建和扩展 UI。所以只需从 onCreateView() 中剪切 populateEmployeeList() 并将其粘贴到 onActivityCreared()
  • ListView 要求检索到的列之一具有名称 _ID。您应该在创建表时使用 _ID 列。使用此链接获取信息developer.android.com/guide/topics/providers/… 并阅读数据设计注意事项部分的第一点。
  • 我在该表中有 Employee_ID 列,而 List 也有该列
  • _ID 在您使用 SimpleCursorAdapter 时需要...如果您使用 BaseAdapter,那么您不需要它。尝试使用 BaseAdapter 填充列表视图
【解决方案2】:

_id 列不存在,请仔细阅读您的错误。您必须采取_id 字段:

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

}

【讨论】:

  • 我有列 Employee_id 可以。或者我只需要 _id。
  • _id 是基列
  • _id 在您使用使用 Cursor 的增强适配器时很有用。这些适配器使用它来提供一个 ID,该 ID 可用于引用表中的特定行,该行与适配器正在使用的任何项目相关联,例如ListView 中的一行。检查此链接sqlite.org
【解决方案3】:

如果我评论这个 populateEmployeeList() 类,那么我的程序就可以工作。 否则会意外关闭

因为从EmployeeDatabaseHelper 类调用getAllEmployee 方法时dbHelpernull

要解决此问题,请在使用dbHelper 对象访问类中的方法之前,通过在类构造函数中传递上下文来创建EmployeeDatabaseHelper 类的对象:

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

【讨论】:

    【解决方案4】:

    我更改了我的代码。它的运行。我不知道它是否会帮助别人,但仍然。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2015-05-05
      • 2017-11-09
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      相关资源
      最近更新 更多