0

我正在開發一個我想存儲我的員工詳細信息的Android應用程序。我無法從數據庫加載ListView中的數據。無法在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 
    } 
} 

我有另一個類僅處理EmployeeTable中諸如插入,刪除等即EmployeeDatabaseHelper從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在本節我的代碼錯了,它是給空指針異常。當我打開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()類,那麼我的程序工作。否則會意外關閉。

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) 
+1

在未來,請張貼ÿ我們的Java堆棧跟蹤在你的問題。另外,不要在主應用程序線程上執行數據庫I/O。 – CommonsWare 2015-03-31 11:22:59

回答

0

我已經改變了我的代碼。它的運行。我不知道它會幫助別人,但還是不行。

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

如果我評論此populateEmployeeList()類,然後我的程序工作。 否則得到意外關閉

因爲dbHelpernullEmployeeDatabaseHelper類調​​用getAllEmployee方法時。

要解決的問題,在類的構造函數傳遞上下文的使用dbHelper對象訪問方法從課前創建EmployeeDatabaseHelper類的對象:

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

仍然無法正常工作。 – 2015-03-31 12:04:04

3

嘗試在片段onActivityCreated()方法使用populateEmployeeList()。 因爲根據您的代碼,您的視圖尚未完成,您正試圖通過致電populateEmployeeList()來填寫listview

+0

和onActivityCreated()將在onCreateView()之後調用。 onCreateView()負責構建和擴充UI。所以只是削減populateEmployeeList()從onCreateView()並將其粘貼到onActivityCreared() – Moinkhan 2015-03-31 12:28:20

+0

還是它不工作等待我分享'LOG Cat' – 2015-03-31 13:00:13

+0

的ListView要求取回一列有姓名_ID。您在創建表時必須使用_ID列。使用此鏈接獲取信息http://developer.android.com/guide/topics/providers/content-provider-creating.html並閱讀「數據設計注意事項」部分的第一點。 – Moinkhan 2015-03-31 13:14:39

3

_id不存在,請仔細閱讀你的錯誤。你必須採取的_id領域:

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

} 
+0

我有列Employee_id它會這樣做。或者我只需要_id。 – 2015-03-31 15:03:49

+0

_id是基列當您使用增強型適配器,這使得使用遊標的 – SAM 2015-04-01 05:46:56

+0

_id是非常有用的。它被這些適配器用來提供一個ID,它可以用來引用表中與該項目相關的特定行,無論該適配器被用於ListView中的一行。檢查這個鏈接http://www.sqlite.org – SAM 2015-04-01 05:54:55

相關問題