blankwall
blankwall

Reputation: 353

Android SQLite errors

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)

Upvotes: 0

Views: 296

Answers (1)

AndroidPenguin
AndroidPenguin

Reputation: 3453

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?

Upvotes: 1

Related Questions