当前位置: 首页 > 知识库问答 >
问题:

使用游标从SQLite返回行,数据库为空时出错

司寇山
2023-03-14

当我的数据库是空的,或者它刚刚被创建时,我得到了这个错误,

03-10 17:34:40.758: E/AndroidRuntime(1144):java.lang.Runtime异常:无法启动活动ComponentInfo{com.example.adressbooktake2/com.example.adressbooktake2。主要活动}:android.database.CursorIndexOutOfBounds异常:请求索引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()。

有人看到解决办法了吗?有正确的诊断问题吗?

共有3个答案

宰父桐
2023-03-14

使用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);
            }


}
巴英韶
2023-03-14

游标为空时,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
}
沙岳
2023-03-14

您可以检查空光标,如下所示:

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

 类似资料:
  • 问题内容: 我正在开发一个短信应用程序,我试图从每次对话中获取最新的短信。 这是我的SQL语句: 我在SQLite Expert中运行了查询,并且得到了正确的响应: 但是,当我在应用程序中运行它时,我得到: 这是我的桌子 这是我的Datamanipulator类: 问题答案: 使用时,结果的每一行对应于原始表的多行。这些结果的计算有三种可能性: 具有聚合函数的列类似于或计算组中所有行的值; 子句中

  • 本文讲解了如何在WeX5中使用SQLite数据库,同时展示了如何在App中加入自己的cordova插件。 SQLite是嵌入式的和轻量级的SQL数据库。广泛用于IOS、Android等设备,实现本地数据存储。 在WeX5中使用SQLlite数据库,步骤如下 1、下载SQLite的cordova插件 (1)、访问https://github.com/brodysoft/Cordova-SQLiteP

  • SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下,只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。如果您正在寻找一个嵌入式数据库项目或解决方案,SQLite是绝对值得考虑。SQLite可以是说开源的Acces

  • 我想使用Java流使用数据库游标。我希望Java流能够根据需要获取和处理行,并避免先在内存中加载所有500万行,然后再进行处理。 是否可以在不将整个表加载到RAM中的情况下使用它? 到目前为止,我的代码如下所示: 它确实工作得很好,但是有点麻烦,我想利用流应用编程接口。

  • 我试图返回SQLite数据库的“category”列中不同值的名称。光标似乎没有返回任何结果。 我正在用一个预先存在的鸟类数据库构建一个Android应用程序。其目的是允许用户通过应用程序探索数据库。我遇到的问题是试图返回数据库中存在的不同种类的鸟类物种。数据库似乎正在成功打开-没有引发SQLite异常-但是在使用查询后,'.MoveTonext'方法似乎没有返回任何数据。 请帮忙,不胜感激。

  • 当我在php中使用MSSQL读取一个包含很长内容的字段时,我得到一个错误 警告:mssql_query()[function.mssql查询]: Unicode仅排序规则中的Unicode数据或ntext数据不能使用DB-库(如ISQL)或ODBC版本3.7或更早版本发送到客户端 我在网上搜索并找到了解决这个问题的方法,发现我需要转换结果以获得可读文本。 然而,我遇到的另一个问题是,文本数据在40