簡體   English   中英

從SQLite中檢索數據並在Listview中顯示

[英]Retrieving data from SQLite and displaying in Listview

我試圖將我的mysqlite數據庫的內容顯示到listview中,我能夠獲取內容並在textview中顯示它們,但由於某種原因我無法將這些細節添加到arraylist中? 我不太確定我做錯了什么。 我已經找了多個解決方案,但它們似乎都沒有工作,我得到一個錯誤

Android.database.CursorIndexOutOfBoundsExecption:請求索引-1

這是我目前擁有的:

在OnCreate:

    ArrayAdapter<Contact> currentContactsAdapter = new ContactArrayAdapter();

    ListView lvcontacts = (ListView) findViewById(R.id.lvContacts);

    lvcontacts.setAdapter(currentContactsAdapter);

    tdb = new TestDBOpenHelper(this, "contact.db", null, 1);
    sdb = tdb.getWritableDatabase();

    new MyContacts().execute();

ListView適配器:

private class ContactArrayAdapter extends ArrayAdapter<Contact>{

    public ContactArrayAdapter(){
        super(MainActivity.this, R.layout.listviewitem, addedContacts);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View itemView = convertView;
        if(itemView == null){
            itemView = getLayoutInflater().inflate(R.layout.listviewitem, parent, false);
        }

        Contact currentContact = addedContacts.get(position);       

        TextView name = (TextView) itemView.findViewById(R.id.tvNameitem);
        name.setText(currentContact.getName());

        TextView phone = (TextView) itemView.findViewById(R.id.tvPhoneitem);
        phone.setText(currentContact.getPhone());

        TextView email = (TextView) itemView.findViewById(R.id.tvEmailitem);
        email.setText(currentContact.getEmail());

        return itemView;
    }
}

GetContacts:

class MyContacts extends AsyncTask<String, String, String> {

    List<Contact> retrievedContacts = new ArrayList<Contact>();

protected String doInBackground(String... args) {

        String cname;
        String cphone;
        String cemail;

        // name of the table to query
        String table_name = "contact";
        // the columns that we wish to retrieve from the tables
        String[] columns = {"FIRST_NAME", "PHONE", "EMAIL"};
        // where clause of the query. DO NOT WRITE WHERE IN THIS
        String where = null;
        // arguments to provide to the where clause
        String where_args[] = null;
        // group by clause of the query. DO NOT WRITE GROUP BY IN THIS
        String group_by = null;
        // having clause of the query. DO NOT WRITE HAVING IN THIS
        String having = null;
        // order by clause of the query. DO NOT WRITE ORDER BY IN THIS
        String order_by = null;
        // run the query. this will give us a cursor into the database
        // that will enable us to change the table row that we are working with
        Cursor c = sdb.query(table_name, columns, where, where_args, group_by, 
        having, order_by);

        for(int i  = 0; i < c.getCount(); i++) {
            cname  =  c.getString(c.getColumnIndex("FIRST_NAME"));
            cphone =  c.getString(c.getColumnIndex("PHONE"));
            cemail =  c.getString(c.getColumnIndex("EMAIL"));
            c.moveToNext();
            retrievedContacts.add(new Contact(cname,cphone,cemail));
        }

        return null;
    }

//Update Contact list when response from server is received 
@Override
protected void onPostExecute(String result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);

    for(Contact contact: retrievedContacts)
        addedContacts.add(contact);
    }
 }  

您的表“聯系人”似乎沒有您嘗試閱讀的確切結構。

Android.database.CursorIndexOutOfBoundsExecption:請求索引-1

這意味着其中一個列名稱不屬於它。

c.getColumnIndex("FIRST_NAME") 
c.getColumnIndex("PHONE")
c.getColumnIndex("EMAIL")

因此,其中一個返回-1而不是索引,因為它們不存在於表中。

編輯:

然后for循環可能有問題。 我建議使用類似的東西:

if (c != null ) {
    if  (c.moveToFirst()) { // Always move at the first item
        do {
            cname  =  c.getString(c.getColumnIndex("FIRST_NAME"));
            cphone =  c.getString(c.getColumnIndex("PHONE"));
            cemail =  c.getString(c.getColumnIndex("EMAIL"));
            retrievedContacts.add(new Contact(cname, cphone, cemail));
        } while (c.moveToNext());
    }
}
c.close(); // always close when done!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM