如何从sqlite数据库中逐行获取并在EditText Box中显示

时间:2015-02-17 08:39:55

标签: android

我经历了这么多链接,老老实实地努力得到我的答案,但仍然搞砸了。 (可能是它的重复问题)。我在Sqlitedatabase中成功插入了几行。我需要在NextPrevious按钮上显示EditText中的每一行。 下面是我的代码

public List<Contact> getAllContacts() {
        List<Contact> contactList = new ArrayList<Contact>();
        // Select All Query
        String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;
        SQLiteDatabase db = this.getWritableDatabase();
        cursor = db.rawQuery(selectQuery, null);
      {
            do{
            Contact contact = new Contact();
            contact.setID(Integer.parseInt(cursor.getString(0)));
            contact.setName(cursor.getString(1));
            contact.setPhoneNumber(cursor.getString(2));
             contactList.add(contact);
             }while(cursor.moveToNext());
            cursor.moveToFirst();
           cursor.close();
        }
         return contactList;
    }

1 个答案:

答案 0 :(得分:3)

游标具有特定的行为,它们在第一个结果之前开始。 所以在做任何事之前你必须moveToFirst

public List<Contact> getAllContacts() {
    List<Contact> contactList = new ArrayList<Contact>();
    // Select All Query
    String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;
    SQLiteDatabase db = this.getWritableDatabase();
    cursor = db.rawQuery(selectQuery, null);
    {
        if (cursor.moveToFirst()) {
            do {
                Contact contact = new Contact();
                contact.setID(Integer.parseInt(cursor.getString(0)));
                contact.setName(cursor.getString(1));
                contact.setPhoneNumber(cursor.getString(2));
                contactList.add(contact);
            } while (cursor.moveToNext());
        }
        cursor.close();
    }
    return contactList;
}

或者你可以循环moveToNext所以在第一次迭代时,光标将指向第一个结果:

public List<Contact> getAllContacts() {
    List<Contact> contactList = new ArrayList<Contact>();
    // Select All Query
    String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;
    SQLiteDatabase db = this.getWritableDatabase();
    cursor = db.rawQuery(selectQuery, null);
    {
        while (cursor.moveToNext()) {
            Contact contact = new Contact();
            contact.setID(Integer.parseInt(cursor.getString(0)));
            contact.setName(cursor.getString(1));
            contact.setPhoneNumber(cursor.getString(2));
            contactList.add(contact);
        }
        cursor.close();
    }
    return contactList;
}

您的代码:
按钮的clicactivity是 show.setOnClickListener(new OnClickListener(){

    @Override
    public void onClick(View v) {
         List<Contact> contacts = db.getAllContacts();       
            for (Contact cn : contacts)
            {
                String log = "Id: "+cn.getID()+" ,Name: " + cn.getName() + " ,Phone: " + cn.getPhoneNumber();
                edit_name.setText(cn.getName());
                edit_phon.setText(cn.getPhoneNumber());
            }

         }
   });

确定。所以你的问题就在于我。 当您单击按钮时,此处的循环将名称(getName())放在EditText中,用于从数据库获得的每个联系人。
此迭代执行此操作(如果您有两个联系人):

  • 获得第一次联系并将其名称放入EditText
  • 循环继续并获得第二次联系并将其名称放入相同的EditText

在此循环结束时,您只显示最后的联系信息。

您可以添加Log.d("CONTACT", cn.getName());以查看它对每个联系人进行迭代。

<强>所以:
应该起作用的是跟踪最新显示的索引。

int index = 0;

@Override
public void onClick(View v) {
    if (v.getId() == R.id.previous) { // android:id="@+id/previous" on the "Previous" button
        index--;
    }
    else if (v.getId() == R.id.next) { // android:id="@+id/next" on the "Next" button
        index++;
    }
    List<Contact> contacts = getAllContacts();
    // Prevent out of bounds
    index = Math.min(Math.max(index, 0), contacts.size() - 1);
    // Fill `EditText`s with contact data
    Contact contact = contacts.get(index);
    edit_name.setText(cn.getName());
    edit_phon.setText(cn.getPhoneNumber());
}

然后,当您单击“上一步”按钮时,它会显示上一个(或者如果没有先前的话)联系人数据。当您点击“下一步”按钮时,它会显示下一个(或最后一个,如果没有下一个)联系人数据。

关于数学使用的注意事项:
如果我有2个联系人,则可用索引为01

index = Math.max(index, 0) => So it is never < 0 (0, the first index)
                  V
index = Math.min(index, contacts.size() - 1) => So it is never > (2 - 1) = 1 (1, the last index)

这可以防止OutOfBoundsException在尝试获取List中没有元素的index中的元素时抛出。{/ p>