2014-03-25 42 views
0

MySqliteDatabase柯乐在列表视图数据和显示取:无法在机器人

public class MySqliteDatabase extends SQLiteOpenHelper { 

    private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_NAME = "EmaployeeDetail"; 
    private static final String TABLE_EMployee = "Employee"; 
    private static final String KEY_ID = "id"; 
    private static final String KEY_NAME = "name"; 
    private static final String KEY_EMAIL = "email"; 

    public MySqliteDatabase(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 

     String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_EMployee + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," 
       + KEY_EMAIL + " TEXT" + ")"; 
     db.execSQL(CREATE_CONTACTS_TABLE); 

    } 

    public void addEmployee(Employee contact) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_NAME, contact.get_name()); // Contact Name 
     values.put(KEY_EMAIL, contact.get_email()); // Contact Phone 

     // Inserting Row 
     db.insert(TABLE_EMployee, null, values); 
     // 2nd argument is String containing nullColumnHack 
     db.close(); // Closing database connection 
    } 

    public List<Employee> getAllContacts() { 
     List<Employee> contactList = new ArrayList<Employee>(); 
     // Select All Query 
     String selectQuery = "SELECT * FROM " + TABLE_EMployee; 

     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 

     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) { 
      do { 
       Employee contact = new Employee(); 
       contact.set_id(Integer.parseInt(cursor.getString(0))); 
       contact.set_name(cursor.getString(1)); 
       contact.set_email(cursor.getString(2)); 
       // Adding contact to list 
       contactList.add(contact); 
      } while (cursor.moveToNext()); 
     } 

     // return contact list 
     return contactList; 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_EMployee); 

     // Create tables again 
     onCreate(db); 
    } 

} 

ContanctAdapter类别:

public class ContanctAdapter extends ArrayAdapter<Employee> { 

    private Activity activity; 
    private List<Employee> items; 
    private int row; 
    private Employee objBean; 

    public ContanctAdapter(Activity act, int row, List<Employee> items) { 
     super(act, row, items); 

     this.activity = act; 
     this.row = row; 
     this.items = items; 

    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     ViewHolder holder; 
     if (view == null) { 
      LayoutInflater inflater = (LayoutInflater) activity 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = inflater.inflate(row, null); 

      holder = new ViewHolder(); 
      view.setTag(holder); 
     } else { 
      holder = (ViewHolder) view.getTag(); 
     } 

     if ((items == null) || ((position + 1) > items.size())) 
      return view; 

     objBean = items.get(position); 

     holder.tvname = (TextView) view.findViewById(R.id.tvname); 

     holder.tvEmail = (TextView) view.findViewById(R.id.tvemail); 

     if (holder.tvname != null && null != objBean.get_name() 
       && objBean.get_name().trim().length() > 0) { 
      holder.tvname.setText(Html.fromHtml(objBean.get_name())); 
     } 

     if (holder.tvEmail != null && null != objBean.get_email() 
       && objBean.get_email().trim().length() > 0) { 
      holder.tvEmail.setText(Html.fromHtml(objBean.get_email())); 
     } 

     return view; 
    } 

    public class ViewHolder { 
     public TextView tvname, tvEmail; 
    } 

} 

MainActivity类别:

public class MainActivity extends Activity { 
    MySqliteDatabase db = new MySqliteDatabase(this); 
    EditText nametext; 
    EditText emailtext; 
    Button btn; 
    public List<Employee> list1 = new ArrayList<Employee>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     nametext = (EditText) findViewById(R.id.editText1); 
     emailtext = (EditText) findViewById(R.id.editText2); 
     btn = (Button) findViewById(R.id.button1); 

     btn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       String name = nametext.getText().toString(); 
       String email = emailtext.getText().toString(); 

       db.addEmployee(new Employee(name, email)); 

       Toast.makeText(getApplicationContext(), "SucessfullyInseter", 
         1000).show(); 

      } 

     }); 

    } 

    @Override 
    protected void onStart() { 
     // TODO Auto-generated method stub 
     super.onStart(); 
     List<Employee> contacts = db.getAllContacts(); 
     Employee emp = new Employee(); 
     for (Employee cn : contacts) { 
      String log = "Id: " + cn.get_id() + " ,Name: " + cn.get_name() 
        + " ,Phone: " + cn.get_email(); 
      // Writing Contacts to log 
      Log.d("Name: ", log); 

      String name1 = cn.get_name(); 
      String Email1 = cn.get_email(); 

      ListView list = (ListView) findViewById(R.id.listView1); 
      emp.set_name(name1); 
      emp.set_email(Email1); 
      contacts.add(emp); 

      ContanctAdapter objAdapter = new ContanctAdapter(MainActivity.this, 
        R.layout.alluser_row, list1); 
      list.setAdapter(objAdapter); 

     } 
    } 

} 

我能够在抓取数据这行Log.d(“Name:”,log); 但是当我使用这行列表视图打印数据:

ContanctAdapter objAdapter = new ContanctAdapter(MainActivity.this, 
       R.layout.alluser_row, list1); 
     list.setAdapter(objAdapter); 

应用变得崩溃,我不知道是什么问题,为什么它的应用程序崩溃,请帮助我哪里做错了,我无法找到问题。

希尔是我的堆栈跟踪:

03-24 10:20:27.850: E/AndroidRuntime(10129): FATAL EXCEPTION: main 
03-24 10:20:27.850: E/AndroidRuntime(10129): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.crudexample/com.example.crudexample.MainActivity}: java.util.ConcurrentModificationException 
03-24 10:20:27.850: E/AndroidRuntime(10129): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1964) 
03-24 10:20:27.850: E/AndroidRuntime(10129): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1989) 
03-24 10:20:27.850: E/AndroidRuntime(10129): at android.app.ActivityThread.access$600(ActivityThread.java:126) 
03-24 10:20:27.850: E/AndroidRuntime(10129): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1155) 
03-24 10:20:27.850: E/AndroidRuntime(10129): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-24 10:20:27.850: E/AndroidRuntime(10129): at android.os.Looper.loop(Looper.java:137) 
03-24 10:20:27.850: E/AndroidRuntime(10129): at android.app.ActivityThread.main(ActivityThread.java:4482) 
03-24 10:20:27.850: E/AndroidRuntime(10129): at java.lang.reflect.Method.invokeNative(Native Method) 
03-24 10:20:27.850: E/AndroidRuntime(10129): at java.lang.reflect.Method.invoke(Method.java:511) 
03-24 10:20:27.850: E/AndroidRuntime(10129): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787) 
03-24 10:20:27.850: E/AndroidRuntime(10129): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554) 
03-24 10:20:27.850: E/AndroidRuntime(10129): at dalvik.system.NativeStart.main(Native Method) 
03-24 10:20:27.850: E/AndroidRuntime(10129): Caused by: java.util.ConcurrentModificationException 
03-24 10:20:27.850: E/AndroidRuntime(10129): at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569) 
03-24 10:20:27.850: E/AndroidRuntime(10129): at com.example.crudexample.MainActivity.onStart(MainActivity.java:62) 
03-24 10:20:27.850: E/AndroidRuntime(10129): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1133) 
03-24 10:20:27.850: E/AndroidRuntime(10129): at android.app.Activity.performStart(Activity.java:4475) 
03-24 10:20:27.850: E/AndroidRuntime(10129): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1937) 
03-24 10:20:27.850: E/AndroidRuntime(10129): ... 11 more 
+0

发布您的logcat。没有人会阅读整个代码。 –

+0

03-24 10:20:27.850:E/AndroidRuntime(10129):java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.crudexample/com.example.crudexample.MainActivity}:java.util.ConcurrentModificationException 03-24 10:20:27.850:E/AndroidRuntime(10129):\t在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1964) – user3432979

+1

@ user3432979发布整个堆栈跟踪 – Raghunandan

回答

3

您不能修改当前正在迭代的列表。至少不是你做到这一点的方式。

for (Employee cn : contacts) { 
     ... 

     contacts.add(emp); 

     ... 
    } 

我会告诉你如何解决它,但坦率地说,你的代码是混乱的地狱。也许这是你的意思:

@Override 
protected void onStart() { 
    // TODO Auto-generated method stub 
    super.onStart(); 
    List<Employee> contacts = db.getAllContacts(); 
    for (Employee cn : contacts) { 
     String log = "Id: " + cn.get_id() + " ,Name: " + cn.get_name() 
       + " ,Phone: " + cn.get_email(); 
     // Writing Contacts to log 
     Log.d("Name: ", log); 
    } 
    ListView list = (ListView) findViewById(R.id.listView1); 
    ContanctAdapter objAdapter = new ContanctAdapter(MainActivity.this, 
       R.layout.alluser_row, contacts); 
    list.setAdapter(objAdapter); 
} 
+0

我们需要PLZ建议 – user3432979

2

如前所述存在代码(ConcurrentModificcationException)问题

要解决有没有需要遍历循环

List<Employee> contacts = db.getAllContacts(); 
ListView list = (ListView) findViewById(R.id.listView1); 
ContanctAdapter objAdapter = new ContanctAdapter(MainActivity.this, 
       R.layout.alluser_row, contacts); 
list.setAdapter(objAdapter); 

你吹一列表视图中每个项目的布局。项目的数量取决于列表的大小。活动代码中不需要for循环。您有一个ListEmployee传递给自定义适配器,即ContanctAdapter,您在那里使用相同的。

而且改变

MySqliteDatabase db = new MySqliteDatabase(this) 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 

MySqliteDatabase db; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
db = new MySqliteDatabase(this); 

上下文可用一旦创建活动。