0

I have been working with AndEngine and developing a game. I have now moved on to trying to implement the scores locking the levels etc. I have been trying to get this sqlite database going for a few hours to really no avail. If I try a level 1 through three it throws errors but still works fine but when I implement a fourth or fifth I cannot access those entries and it force closes. The exact errors I am getting is cursor out of bounds exception and close() was never explicitly called. Any help is appreciated.

Here is my database class

package com.example.test;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

 public class myDatabase extends SQLiteOpenHelper {

    static final String dbName = "myDB";
    static final String tLevels = "Levels";
    static final String fLevelID = "levelNum";
    static final String fLevelUnLocked = "levelLocked";
    static final String fLevelBeat = "levelBeat";
    static final String fLevelScore = "levelScore";

    public myDatabase(Context context) {

            super(context, dbName, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

            db.execSQL("CREATE TABLE IF NOT EXISTS "+tLevels+" (" +
                                    fLevelID + " INTEGER PRIMARY KEY , " +
                                    fLevelUnLocked + " TEXT, " +
                                    fLevelBeat + " TEXT, " +
                                    fLevelScore + " TEXT" +
                                    ")");


             ContentValues cv = new ContentValues();
                    cv.put(fLevelID, 1);
                    cv.put(fLevelUnLocked, "true");
                    cv.put(fLevelBeat, "false");
                    cv.put(fLevelScore, "0");
                            db.insert(tLevels, null, cv);
                    cv.put(fLevelID, 2);
                    cv.put(fLevelUnLocked, "false");
                    cv.put(fLevelBeat, "false");
                    cv.put(fLevelScore, "0");
                            db.insert(tLevels, null, cv);
                    cv.put(fLevelID, 3);
                    cv.put(fLevelUnLocked, "false");
                    cv.put(fLevelBeat, "false");
                    cv.put(fLevelScore, "0");
                            db.insert(tLevels, null, cv);
                    cv.put(fLevelID, 4);
                    cv.put(fLevelUnLocked, "false");
                    cv.put(fLevelBeat, "false");
                    cv.put(fLevelScore, "0");
                            db.insert(tLevels, null, cv);


    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

            db.execSQL("DROP TABLE IF EXISTS "+tLevels);
            onCreate(db);
    }

     public String isLevelUnLocked(int ID) {                 
             SQLiteDatabase myDB = this.getReadableDatabase();
             String[] mySearch = new String[]{String.valueOf(ID)};
             Cursor myCursor = myDB.rawQuery("SELECT "+ fLevelUnLocked +" FROM "+               tLevels +" WHERE "+ fLevelID +"=?",mySearch);
             myCursor.moveToFirst();
             int index = myCursor.getColumnIndex(fLevelUnLocked);
             String myAnswer = myCursor.getString(index);
             myCursor.close();
             myDB.close();
             return myAnswer;
     }

     public String isBeat(int ID) {

                         SQLiteDatabase myDB = this.getReadableDatabase();
                         String[] mySearch = new String[]{String.valueOf(ID)};
                         Cursor myCursor = myDB.rawQuery("SELECT "+ fLevelBeat +" FROM "+ tLevels +" WHERE "+ fLevelID +"=?",mySearch);
                         myCursor.moveToFirst();
                         int index = myCursor.getColumnIndex(fLevelBeat);
                         String myAnswer = myCursor.getString(index);
                         myCursor.close();
                         return myAnswer;
                 }


     public int unLockLevel(int ID, String isUnLocked)
     {
            SQLiteDatabase myDB = this.getWritableDatabase();
             ContentValues cv = new ContentValues();
             cv.put(fLevelUnLocked, isUnLocked);
             int numRowsAffected = myDB.update(tLevels, cv, fLevelID+"=?", new String            []{String.valueOf(ID)});
             return numRowsAffected;
     }




  }

And here is the bit of main activity that I am calling it with

myDatabase myDB = new myDatabase(this);


         final String checkUnLocked = myDB.isLevelUnLocked(4);

         System.out.println(checkUnLocked);
         if(checkUnLocked.compareTo("true") == 0){
         System.out.println("level one is unlocked!");
         }else{
         System.out.println("level one is not unlocked!");
         }
         myDB.close();

And here is the log cat

12-27 13:40:14.896: E/AndEngine(4819): [Debug.java:372:e()]         World1Activity.onCreateScene failed. @(Thread: 'GLThread 13')
12-27 13:40:14.896: E/AndEngine(4819): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
12-27 13:40:14.896: E/AndEngine(4819):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
12-27 13:40:14.896: E/AndEngine(4819):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
12-27 13:40:14.896: E/AndEngine(4819):  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
12-27 13:40:14.896: E/AndEngine(4819):  at com.example.test.myDatabase.isLevelUnLocked(myDatabase.java:97)
12-27 13:40:14.896: E/AndEngine(4819):  at com.example.test.World1Activity.onCreateScene(World1Activity.java:159)
12-27 13:40:14.896: E/AndEngine(4819):  at org.andengine.ui.activity.SimpleBaseGameActivity.onCreateScene(SimpleBaseGameActivity.java:48)
12-27 13:40:14.896: E/AndEngine(4819):  at org.andengine.ui.activity.BaseGameActivity$3.onCreateResourcesFinished(BaseGameActivity.java:169)
12-27 13:40:14.896: E/AndEngine(4819):  at org.andengine.ui.activity.SimpleBaseGameActivity.onCreateResources(SimpleBaseGameActivity.java:43)
12-27 13:40:14.896: E/AndEngine(4819):  at org.andengine.ui.activity.BaseGameActivity.onCreateGame(BaseGameActivity.java:181)
12-27 13:40:14.896: E/AndEngine(4819):  at org.andengine.ui.activity.BaseGameActivity.onSurfaceCreated(BaseGameActivity.java:110)
12-27 13:40:14.896: E/AndEngine(4819):  at org.andengine.opengl.view.EngineRenderer.onSurfaceCreated(EngineRenderer.java:80)
12-27 13:40:14.896: E/AndEngine(4819):  at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1348)
12-27 13:40:14.896: E/AndEngine(4819):  at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118)
12-27 13:40:14.896: D/AndEngine(4819): [Debug.java:218:d()] World1Activity.onSurfaceChanged(Width=800,  Height=480) @(Thread: 'GLThread 13')
12-27 13:40:15.076: E/Database(4819): [SQLiteDatabase.java:1825:finalize()] close() was never explicitly called on database '/data/data/com.example.test/databases/myDB' 
12-27 13:40:15.076: E/Database(4819): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
12-27 13:40:15.076: E/Database(4819):   at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1847)
12-27 13:40:15.076: E/Database(4819):   at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
12-27 13:40:15.076: E/Database(4819):   at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
12-27 13:40:15.076: E/Database(4819):   at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
12-27 13:40:15.076: E/Database(4819):   at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:579)
12-27 13:40:15.076: E/Database(4819):   at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
12-27 13:40:15.076: E/Database(4819):   at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
12-27 13:40:15.076: E/Database(4819):   at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
12-27 13:40:15.076: E/Database(4819):   at com.example.test.myDatabase.isLevelUnLocked(myDatabase.java:92)
12-27 13:40:15.076: E/Database(4819):   at com.example.test.World1Activity.onCreateScene(World1Activity.java:159)
12-27 13:40:15.076: E/Database(4819):   at org.andengine.ui.activity.SimpleBaseGameActivity.onCreateScene(SimpleBaseGameActivity.java:48)
12-27 13:40:15.076: E/Database(4819):   at org.andengine.ui.activity.BaseGameActivity$3.onCreateResourcesFinished(BaseGameActivity.java:169)
12-27 13:40:15.076: E/Database(4819):   at org.andengine.ui.activity.SimpleBaseGameActivity.onCreateResources(SimpleBaseGameActivity.java:43)
12-27 13:40:15.076: E/Database(4819):   at org.andengine.ui.activity.BaseGameActivity.onCreateGame(BaseGameActivity.java:181)
12-27 13:40:15.076: E/Database(4819):   at org.andengine.ui.activity.BaseGameActivity.onSurfaceCreated(BaseGameActivity.java:110)
12-27 13:40:15.076: E/Database(4819):   at org.andengine.opengl.view.EngineRenderer.onSurfaceCreated(EngineRenderer.java:80)
12-27 13:40:15.076: E/Database(4819):   at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1348)
12-27 13:40:15.076: E/Database(4819):   at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118)
2
  • 1
    Did you open your database? Commented Dec 27, 2012 at 22:00
  • I used myDatabase myDB = new myDatabase(this) to open it Commented Dec 27, 2012 at 22:01

1 Answer 1

1

Try changing your cursor within isLevelUnlocked(int ID) to the following

Cursor myCursor = myDb.query(tLevels, new String [] {fLevelID, fLevelUnlocked, fLevelBeat, fLevelScore }, fLevelID + "=" String.valueOf(ID), null, null, null, null);

See if that works?

Sign up to request clarification or add additional context in comments.

1 Comment

I just figured that out like 5 minutes ago after tons of googling. I came in to answer my own and saw yours. Thanks for the help.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.