热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

索引0在SQLITEDB中请求大小为0的错误

如何解决《索引0在SQLITEDB中请求大小为0的错误》经验,为你挑选了2个好方法。

数据库中有数据(准确地说是2行),每个数据都有信息.

以下是DBADAPTER中的代码(重要的,不是全部):

// Field Names:
    public static final String KEY_ROWID = "_id";
    public static final String KEY_DEVICE = "device";
    public static final String KEY_TYPE = "type";
    public static final String KEY_DEVID = "devid";

    public static final String[] ALL_KEYS = new String[] {KEY_ROWID, KEY_DEVICE, KEY_TYPE, KEY_DEVID};
    public static final String[] DEVID_KEY = new String[] {KEY_DEVID};

    // Column Numbers for each Field Name:
    public static final int COL_ROWID = 0;
    public static final int COL_DEVICE = 1;
    public static final int COL_TYPE = 2;
    public static final int COL_DEVID = 3;

    // DataBase info:
    public static final String DATABASE_NAME = "dbDevices";
    public static final String DATABASE_TABLE = "mainDevices";
    public static final int DATABASE_VERSION = 10; // The version number must be incremented each time a change to DB structure occurs.

    //SQL statement to create database
    private static final String DATABASE_CREATE_SQL = 
            "CREATE TABLE " + DATABASE_TABLE 
            + " (" + KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
            + KEY_DEVICE + " TEXT NOT NULL, "
            + KEY_TYPE + " TEXT, "
            + KEY_DEVID + " TEXT NOT NULL "
            + ");";

    private final Context context;
    private DatabaseHelper myDBHelper;
    private SQLiteDatabase db;

    // Get a specific row (by devid)
        public String getDevName(String devid) {
            String name;
            String where = KEY_DEVID + " like '%" + devid + "%'";
            Cursor c =  db.query(true, DATABASE_TABLE, ALL_KEYS, 
                            where, null, null, null, null, null);
                c.moveToFirst();
                name = c.getString(COL_DEVICE);
            return name;
        }

这是调用它的代码:

String incomingMessage = " ";
incomingMessage = in.readLine() + System.getProperty("line.separator");
devName = devDB.getDevName(incomingMessage);

我知道这是获取信息,因为它记录:
03-16 15:39:47.072: V/String(18073): 5122

每当我运行这个时,我都会收到错误:

03-16 15:39:47.122: W/System.err(18073): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
03-16 15:39:47.122: W/System.err(18073):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:426)
03-16 15:39:47.122: W/System.err(18073):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
03-16 15:39:47.132: W/System.err(18073):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
03-16 15:39:47.132: W/System.err(18073):    at com.ti.cc3x.android.DBAdapter.getDevName(DBAdapter.java:121)
03-16 15:39:47.132: W/System.err(18073):    at com.ti.cc3x.android.broadcastListener$1.run(broadcastListener.java:112)
03-16 15:39:47.132: W/System.err(18073):    at java.lang.Thread.run(Thread.java:841)

我试过检查非空游标.所有这一切都告诉我什么.我知道有数据我要求它看起来我只是不知道为什么它不会显示它.谁能告诉我哪里出错了?谢谢!



1> bwegs..:

你在用SQLiteOpenHelper吗?如果是这样,您需要尝试读取或写入db数据库之前将数据库变量设置为数据库,如下所示:

db = this.getWritableDatabase();

...你的新getDevName(..)方法应该是这样的:

public String getDevName(String devid) {
    db = this.getWritableDatabase();

    String name;
    String where = KEY_DEVID + " like '%" + devid + "%'";
    Cursor c =  db.query(true, DATABASE_TABLE, ALL_KEYS, 
                    where, null, null, null, null, null);
    c.moveToFirst();
    name = c.getString(COL_DEVICE);

    db.close(); // close your db connection when you're done with it

    return name;
}

从Android Developer文档:

public SQLiteDatabase getWritableDatabase() - 第一次调用它时,将打开数据库并调用onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)和/或onOpen(SQLiteDatabase).成功打开后,数据库将被缓存,因此您可以在每次需要写入数据库时​​调用此方法.(确保在不再需要数据库时调用close().)错误权限或完整磁盘等错误可能导致此方法失败,但如果问题得到解决,将来的尝试可能会成功.



2> Daniel Nugen..:

扩展@bwegs关于呼叫的答案getWritableDatabase().

尝试使用selectionArgs它,因为它更干净.检查返回值moveToFirst(),并确保关闭光标以避免内存泄漏.

 public String getDevName(String devid) {
    db = myDBHelper.getWritableDatabase();  //get db if not done so already, you may have already done this in code not shown

    String name = null;
    String where = KEY_DEVID + " like ?";
    String[] selectiOnArgs=  new String[] {"%"+ devid + "%" };
    Cursor c =  db.query(true, DATABASE_TABLE, ALL_KEYS, 
                    where, selectionArgs , null, null, null, null);

    //Only use cursor if moveToFirst() succeeds
    //this will make it so that you don't get the CursorIndexOutOfBoundsException
    if (c.moveToFirst()){
        name = c.getString(COL_DEVICE);
    }

    c.close(); //close your cursor to avoid memory leak!

    db.close(); //close here if you call getWritableDatabase() in beginning of this function

    //This will return null if no results from query
    return name;
}


这个答案正在[meta]讨论(http://meta.stackoverflow.com/questions/288191/how-to-handle-a-copy-cat-that-eventually-edits-their-way-to-an-原来,答案)
推荐阅读
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
author-avatar
想零的时候
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有