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

混淆光标索引超出范围异常-Confusingcursorindexoutofboundsexception

IhaveadatabasethatcontainslevelandstageofthegameandtheproblemiseverytimeIcallmet

I have a database that contains level and stage of the game and the problem is every time I call method getId(), getLevel() or getStage() in my code, it's just throws CursorIndexOutOfBoundsException. I have 5 indices of my database but it tells me that only 0 indices are available. This is the code:

我有一个包含游戏级别和阶段的数据库,问题是每次我在我的代码中调用方法getId(),getLevel()或getStage()时,它只会抛出CursorIndexOutOfBoundsException。我有5个数据库索引,但它告诉我只有0个索引可用。这是代码:

Database helper class:

数据库助手类:

public class DatabaseGame extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "DB2.db";
private static final int SCHEMA_VERSION = 6;

public DatabaseGame(Context context) {
    super(context, DATABASE_NAME, null, SCHEMA_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE save_progress (ID INTEGER PRIMARY KEY NOT NULL, LEVEL VARCHAR(3), STAGE1 VARCHAR(3), STAGE2 VARCHAR(3), STAGE3 VARCHAR(3));");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

}

public void insert(String level, String stage1, String stage2, String stage3) {
    ContentValues carry = new ContentValues();

    carry.put("ID", 1);
    carry.put("LEVEL", level);
    carry.put("STAGE1", stage1);
    carry.put("STAGE2", stage2);
    carry.put("STAGE3", stage3);

    getWritableDatabase().insert("save_progress", null, carry);
}

public void update(int id, String level, String stage1, String stage2,
        String stage3) {
    getWritableDatabase().execSQL(
            "UPDATE save_progress SET LEVEL = '" + level + "', STAGE1 = '"
                    + stage1 + "', STAGE2 = '" + stage2 + "', STAGE3 = '"
                    + stage3 + "'  WHERE ID = " + id + ";");
}

public Cursor getAll() {
    return (getReadableDatabase().rawQuery("SELECT * FROM save_progress",
            null));
}

public String getId(Cursor c) {
    return (c.getString(0));
}

public String getLevel(Cursor c) {
    return (c.getString(1));
}

public String getStage(Cursor c, int level) {
    return (c.getString(level + 1));
}
}

Main class. The error occures when I access Integer.parseInt(db.getLevel(select)):

主要课程。访问Integer.parseInt(db.getLevel(select))时发生错误:

public class Level extends Activity {

DatabaseGame db = null;
Handler handlerTimer = new Handler();
ImageButton lv1, lv2, lv3;
Animation b1, b2, b3;
Cursor select = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.level);
    b1 = AnimationUtils.loadAnimation(this, R.anim.button);
    b2 = AnimationUtils.loadAnimation(this, R.anim.button);
    b3 = AnimationUtils.loadAnimation(this, R.anim.button);

    db = new DatabaseGame(this);
    select = db.getAll();
    if(select == null) {
        db.insert("1", "1", "1", "1");
    }
    initAnimation();
    super.onCreate(savedInstanceState);
}

@Override
protected void onPause() {
    super.onPause();
    db.close();
    finish();
}

public void initAnimation() {
    Thread animated = new Thread() {
        public void run() {
            try {
                lv1 = (ImageButton) findViewById(R.id.level1);
                lv1.setImageResource(R.drawable.level1_b);
                lv1.setAnimation(b1);
                lv1.startAnimation(b1);
                lv1.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        Bundle trans = new Bundle();
                        trans.putInt("level", 1);
                        Intent change = new Intent("com.idncd.indonesiaku.STAGE");
                        change.putExtras(trans);
                        startActivity(change);
                    }
                });

                handlerTimer.postDelayed(new Runnable() {
                    public void run() {
                        if (Integer.parseInt(db.getLevel(select)) > 1) {
                            lv2 = (ImageButton) findViewById(R.id.level2);
                            lv2.setImageResource(R.drawable.level2_b);
                            lv2.setAnimation(b2);
                            lv2.startAnimation(b2);
                            lv2.setOnClickListener(new View.OnClickListener() {

                                @Override
                                public void onClick(View v) {
                                    Bundle trans = new Bundle();
                                    trans.putInt("level", 1);
                                    Intent change = new Intent("com.idncd.indonesiaku.STAGE");
                                    change.putExtras(trans);
                                    startActivity(change);
                                }
                            });
                        } else {
                            lv2 = (ImageButton) findViewById(R.id.level2);
                            lv2.setImageResource(R.drawable.level2_un_b);
                            lv2.setAnimation(b2);
                            lv2.startAnimation(b2);
                            lv2.setOnClickListener(new View.OnClickListener() {

                                @Override
                                public void onClick(View v) {

                                }
                            });
                        }
                    }
                }, 300);

                handlerTimer.postDelayed(new Runnable() {
                    public void run() {
                        if (Integer.parseInt(db.getLevel(select)) > 2) {
                            lv3 = (ImageButton) findViewById(R.id.level3);
                            lv3.setImageResource(R.drawable.level3_b);
                            lv3.setAnimation(b3);
                            lv3.startAnimation(b3);
                            lv3.setOnClickListener(new View.OnClickListener() {

                                @Override
                                public void onClick(View v) {
                                    Bundle trans = new Bundle();
                                    trans.putInt("level", 1);
                                    Intent change = new Intent("com.idncd.indonesiaku.STAGE");
                                    change.putExtras(trans);
                                    startActivity(change);
                                }
                            });
                        } else {
                            lv3 = (ImageButton) findViewById(R.id.level3);
                            lv3.setImageResource(R.drawable.level3_un_b);
                            lv3.setAnimation(b3);
                            lv3.startAnimation(b3);
                            lv3.setOnClickListener(new View.OnClickListener() {

                                @Override
                                public void onClick(View v) {

                                }
                            });
                        }
                    }
                }, 600);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    animated.start();
}

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        Intent menu = new Intent("com.idncd.indonesiaku.MAINMENU");
        startActivity(menu);
        return true;
    } else {
        return super.onKeyUp(keyCode, event);
    }
}
}

Thank you for your help.

谢谢您的帮助。

2 个解决方案

#1


2  

You have to firstly set location of Cursor refrence before use it , Use moveToFirsrt(), moveToLast() etc..

在使用之前,你必须先设置Cursor参考的位置,使用moveToFirsrt(),moveToLast()等。

#2


0  

The question is a little unclear, but I assume you mean that SELECT * doesn't return all the columns you have in your onCreate().

问题有点不清楚,但我认为你的意思是SELECT *不会返回你在onCreate()中的所有列。

You have updated SCHEMA_VERSION but your onUpgrade() is empty. Therefore the database hasn't actually been updated, though the framework thinks so since onUpgrade() returned successfully.

您已更新SCHEMA_VERSION,但您的onUpgrade()为空。因此,实际上并没有更新数据库,尽管框架认为是因为onUpgrade()成功返回。

Clean your app data or uninstall it to remove the old database file. Then when the application is run again, your database helper onCreate() recreates it correctly.

清理您的应用数据或将其卸载以删除旧的数据库文件。然后,当再次运行应用程序时,数据库帮助程序onCreate()会正确地重新创建它。


推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • Android和iOS的数据库都是用SQLite来实现.一,SQLite数据库简介:轻量级:SQLite数据库是一个轻量级的数据库,适用于少量数据的CURD;文件本质:SQL ... [详细]
  • WhenImtryingtorunthefollowing:当我试图运行以下内容时:ContentValuescvnewContentValues();cv ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
author-avatar
手机用户2502859707
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有