我经历了这么多链接,老老实实地努力得到我的答案,但仍然搞砸了。 (可能是它的重复问题)。我在Sqlitedatabase中成功插入了几行。我需要在Next
和Previous
按钮上显示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;
}
答案 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个联系人,则可用索引为0
和1
。
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>