当我的数据库为空或刚刚创建时,我收到此错误,
03-10 17:34:40.758:E / AndroidRuntime(1144): java.lang.RuntimeException:无法启动活动 ComponentInfo {com.example.adressbooktake2 / com.example.adressbooktake2.MainActivity}: android.database.CursorIndexOutOfBoundsException:请求索引0,大小为0
这是我的主要课程中的代码,
public class MainActivity extends Activity {
DBAdaptor db;
Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
db = new DBAdaptor(this).open();
cursor = db.getAllRecords();
DisplayRecord(cursor);
}
然后在我的DBAdaptor类中调用此代码,
public Cursor getAllRecords()
{
Cursor gaRecords = db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME,
KEY_PHONENUMBER, KEY_EMAIL}, null, null, null, null, null);
gaRecords.moveToFirst();
return gaRecords;
}
}
我认为问题在于,刚创建数据库时,moveToFirst()无处可去,因为没有数据。但我不知道如何绕过这个,因为我需要一个moveToFirst()来存放一个库存数据库。
有人看到解决方案吗?是否正确诊断出问题?
答案 0 :(得分:1)
你可以像这样检查一个空的光标:
...
cursor = db.getAllRecords();
if(cursor.getCount() > 0)
DisplayRecords(cursor);
else
DisplayNoRecordsMessage();
或者您在上一个问题中发布了DisplayRecords()
,您也可以使用:
...
if (c != null && !cursor.isAfterLast())
{
nameTxt.setText(c.getString(1));
phoneTxt.setText(c.getString(2));
emailTxt.setText(c.getString(3));
}
另请阅读Java naming convention,其中指出方法名称应以小写字母开头。
答案 1 :(得分:0)
Cursor.moveToFirst()在空光标的情况下返回false。
请参阅文档:http://developer.android.com/reference/android/database/Cursor.html#moveToFirst()
我说问题出在DisplayRecord()。
您是否在DisplayRecord()中从光标中获取数据?如果是这样,你应该检查光标是否包含一些数据,调用 moveToFirst 并检查其结果。
像
这样的东西private void DisplayRecord(Cursor c){
if(!c.moveToFirst()){
return;
}
// do stuff
}
答案 2 :(得分:0)
使用if(cursor .moveToFirst())来检查光标
public class MainActivity extends Activity {
DBAdaptor db;
Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
db = new DBAdaptor(this).open();
cursor = db.getAllRecords();
if(cursor.moveToFirst()){
DisplayRecord(cursor);
}
}