2012-12-27 79 views
0

我一直在與AndEngine合作開發遊戲。我現在已經開始試圖實現鎖定關卡等級的分數了。我一直在試圖讓這個sqlite數據庫進行幾個小時,真的無濟於事。如果我嘗試通過三級別1它會引發錯誤,但仍然正常工作,但是當我執行第四或第五時,我無法訪問這些條目,它強制關閉。我得到的確切錯誤是遊標超出界限異常,並且close()從未明確調用過。任何幫助表示讚賞。Android SQLite錯誤

這裏是我的數據庫類

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; 
    } 




    } 

這裏是主要的活動,我與

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(); 

調用它,這裏的位是日誌貓

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) 
+1

什麼錯誤? logcat的? – Ahmad

+1

你打開你的數據庫了嗎? –

+0

我用myDatabase myDB = new myDatabase(這個)來打開它 – blankwall

回答

1

嘗試將isLevelUnlocked(int ID)內的光標更改爲以下內容

光標myCursor = myDb.query(tLevels,新的String [] {fLevelID, fLevelUnlocked,fLevelBeat,fLevelScore},fLevelID + 「=」 將String.valueOf(ID),NULL,NULL,NULL,NULL) ;

看看是否有用?

+1

我剛剛通過大量的谷歌搜索發現,就像5分鐘前一樣。我進來回答自己的看法。謝謝您的幫助。 – blankwall

+0

我的榮幸:-) – AndroidPenguin