2013-03-10 56 views
0

当我的数据库是空的,或者它刚刚创建我收到此错误,使用光标从SQLite的返回行,错误时,数据库是空

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()来存储数据库。

任何人都看到解决方案吗?有正确的诊断问题吗?

回答

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其中规定该方法名称应该以小写字母开头。

+0

这整理吧!但我不明白为什么。是否因为它只在光标上传递,如果它大于0?它在0时会发生什么?它只是被遗忘了吗? – user2153547 2013-03-10 17:54:28

+0

@ user2153547确切地说,当'getCount()== 0'时,你的代码将不会调用'DisplayRecords()',当有行时它们将逐一显示。 – Sam 2013-03-10 17:57:53

+1

@ρяσѕρєяK作者只想一次显示一条记录,我从之前的问题知道这一点。 :)(这就是为什么我没有使用'moveToFirst()'。) – Sam 2013-03-10 17:59:03

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 
} 
0

如果使用(光标.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); 
      } 


}