0

EDIT 4: У меня есть игра Im, пытающаяся использовать для сохранения рекорда. В главном меню пользователь нажимает кнопку «View Highscore», которая вызывает активность ViewHighscores. Отсюда активность пытается отобразить все текущие сохраненные баллы. Похоже, он считает, что база данных пуста, и что его никогда не достигает OnCreate, но я не знаю, почемуNullpointer Исключение при извлечении из базы данных тоже курсор

package nick.android.com; 

import java.util.ArrayList; 
import android.app.ListActivity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ArrayAdapter; 

public class ViewHighscores extends ListActivity { 

/** Called when the activity is first created. */ 

private ArrayAdapter<String> myHighscoreAdapter; 
private ArrayList<String> myHighscoreMessage = new ArrayList<String>(); 
ArrayList<Object> data = new ArrayList<Object>(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.viewhighscores); 

    myHighscoreAdapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, myHighscoreMessage); 

    setListAdapter(myHighscoreAdapter); 

    retrieveHighscores(); 

} 

public void retrieveHighscores() { 

    DatabaseOpenHelper database = new DatabaseOpenHelper(this); 

    Cursor cursor = database.getHighscore(); 

    if (cursor != null && cursor.getCount() > 0) { 

     cursor.moveToFirst(); 

     while (cursor.isAfterLast() == false) { 

      data.add(cursor.getString(0)); 
      data.add(cursor.getString(1)); 

      displayHighscores(); 

      cursor.moveToNext(); 
     } 
    } else { 
     myHighscoreAdapter.add("No Highscores Recorded Yet"); 
    } 

} 

public void displayHighscores() { 

    myHighscoreAdapter.add("Highscore: " + data); 

} 

public void returnToMenu(View view) { 

    finish(); 
    Intent returnToMenuButton = new Intent(view.getContext(), 
      MainMenu.class); 
    startActivity(returnToMenuButton); 
} 

} 

Вот кусок кода из самой игры, которая пытается тоже писать слишком базу данных. GetUserName(); извлекает имя пользователя из EditText и numberOfGuesses это число между 1 и 12

public void saveHighscore() { 

    scoreSaved = true; 

    getUserName(); 

    DatabaseOpenHelper database = new DatabaseOpenHelper(this); 

    database.addHighscore(userName, numberOfGuesses); 

} 

Вот класс DatabaseOpenHelper

package nick.android.com; 

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

public class DatabaseOpenHelper extends SQLiteOpenHelper { 

private static final int DATABASE_VERSION = 2; 
private static final String DATABASE_NAME = "HIGHSCORE_DATABASE"; 
private static final String HIGHSCORE_TABLE = "highscore"; 
static final String col_HighscoreID = "_id"; 
static final String col_HighscoreUser = "highscoreuser"; 
static final String col_Highscore = "highscore"; 
private SQLiteDatabase db; 

DatabaseOpenHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 

} 

public void onCreate(SQLiteDatabase db) { 

    db.execSQL("CREATE TABLE " + HIGHSCORE_TABLE + " (" + col_HighscoreID 
      + " INTEGER PRIMARY KEY AUTOINCREMENT, " + col_HighscoreUser 
      + " TEXT , " + col_Highscore + " INTEGER)"); 

    System.out.println("ITS GETTING HERE"); 

    inputComputerHighscores(); 

} 

public void inputComputerHighscores() { 

    ContentValues value = new ContentValues(); 
    SQLiteDatabase db = this.getWritableDatabase(); 

    try { 

     value.put(col_HighscoreUser, "Gold"); 
     value.put(col_Highscore, "3"); 
     db.insert(HIGHSCORE_TABLE, null, value); 

     long dbcheck = db.insert(HIGHSCORE_TABLE, null, value); 
     System.out.println(dbcheck); 

     value.put(col_HighscoreUser, "Silver"); 
     value.put(col_Highscore, "6"); 
     db.insert(HIGHSCORE_TABLE, null, value); 

     value.put(col_HighscoreUser, "Bronze"); 
     value.put(col_Highscore, "9"); 
     db.insert(HIGHSCORE_TABLE, null, value); 

    } catch (Exception e) { 

     Log.e("DB Error", e.toString()); 
     e.printStackTrace(); 

    } 

    db.close(); 

} 

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

} 

public Cursor getHighscore() { 

    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = null; 

    try { 

     cursor = db.query(HIGHSCORE_TABLE, new String[] { col_HighscoreID, 
       col_HighscoreUser, col_Highscore }, null, null, null, null, 
       col_Highscore + " asc"); 

    } catch (Exception e) { 

     Log.e("DB Retrieval Error", e.toString()); 
     e.printStackTrace(); 

    } 

    db.close(); 

    return cursor; 

} 


public void addHighscore(String Username, int Score) { 

    ContentValues value = new ContentValues(); 

    value.put(col_HighscoreUser, Username); 
    value.put(col_Highscore, Score); 

    SQLiteDatabase db = this.getWritableDatabase(); 

    try { 

     db.insert(HIGHSCORE_TABLE, null, value); 

    } catch (Exception e) { 

     Log.e("DB Error", e.toString()); 
     e.printStackTrace(); 

    } 

} 

} 

А вот LogCat если я открываю свою деятельность ViewHighscores < < < изменившихся EDIT 5 - Теперь сила снова закрывается:

01-13 16:06:17.032: D/AndroidRuntime(444): Shutting down VM 
01-13 16:06:17.032: W/dalvikvm(444): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
01-13 16:06:17.042: E/AndroidRuntime(444): FATAL EXCEPTION: main 
01-13 16:06:17.042: E/AndroidRuntime(444): java.lang.RuntimeException: Unable to start activity ComponentInfo{nick.android.com/nick.android.com.ViewHighscores}: java.lang.IllegalStateException: getWritableDatabase called recursively 
01-13 16:06:17.042: E/AndroidRuntime(444): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
01-13 16:06:17.042: E/AndroidRuntime(444): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
01-13 16:06:17.042: E/AndroidRuntime(444): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
01-13 16:06:17.042: E/AndroidRuntime(444): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
01-13 16:06:17.042: E/AndroidRuntime(444): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-13 16:06:17.042: E/AndroidRuntime(444): at android.os.Looper.loop(Looper.java:123) 
01-13 16:06:17.042: E/AndroidRuntime(444): at android.app.ActivityThread.main(ActivityThread.java:3683) 
01-13 16:06:17.042: E/AndroidRuntime(444): at java.lang.reflect.Method.invokeNative(Native Method) 
01-13 16:06:17.042: E/AndroidRuntime(444): at java.lang.reflect.Method.invoke(Method.java:507) 
01-13 16:06:17.042: E/AndroidRuntime(444): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
01-13 16:06:17.042: E/AndroidRuntime(444): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
01-13 16:06:17.042: E/AndroidRuntime(444): at dalvik.system.NativeStart.main(Native Method) 
01-13 16:06:17.042: E/AndroidRuntime(444): Caused by: java.lang.IllegalStateException: getWritableDatabase called recursively 
01-13 16:06:17.042: E/AndroidRuntime(444): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:101) 
01-13 16:06:17.042: E/AndroidRuntime(444): at nick.android.com.DatabaseOpenHelper.inputComputerHighscores(DatabaseOpenHelper.java:40) 
01-13 16:06:17.042: E/AndroidRuntime(444): at nick.android.com.DatabaseOpenHelper.onCreate(DatabaseOpenHelper.java:33) 
01-13 16:06:17.042: E/AndroidRuntime(444): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:126) 
01-13 16:06:17.042: E/AndroidRuntime(444): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187) 
01-13 16:06:17.042: E/AndroidRuntime(444): at nick.android.com.DatabaseOpenHelper.getHighscore(DatabaseOpenHelper.java:78) 
01-13 16:06:17.042: E/AndroidRuntime(444): at nick.android.com.ViewHighscores.retrieveHighscores(ViewHighscores.java:39) 
01-13 16:06:17.042: E/AndroidRuntime(444): at nick.android.com.ViewHighscores.onCreate(ViewHighscores.java:31) 
01-13 16:06:17.042: E/AndroidRuntime(444): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
01-13 16:06:17.042: E/AndroidRuntime(444): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
01-13 16:06:17.042: E/AndroidRuntime(444): ... 11 more 
+0

Какая из строк 42 в ViewHighscores.java? Вот где NPE происходит – Guillaume

+0

Строка 42 - это if (! (Cursor == null)) { –

+0

Да, это странно, уверены ли вы, что трассировка стека была получена с помощью этой точной версии кода? разве вы не изменили его немного с тех пор? – Guillaume

ответ

0

Изменить это:

if (!(cursor == null)) { 

    cursor.moveToFirst(); 

    if (!cursor.isAfterLast()) { 

Чтобы что-то вроде этого, и какое-то время:

if (cursor != null && cursor.getCount() > 0) { 

    cursor.moveToFirst(); 

while (cursor.isAfterLast() == false){ 

//Do what you want 


cursor.moveToNext(); 
} 

Но в соответствии с вашими последнего редактирования, что может быть не достаточно, так как, возможно, вы ничего не спасает.

+0

Это предотвратило ее закрытие всякий раз, когда я пытался открыть Activity, поэтому спасибо за это. Однако он всегда говорит, что в курсоре нет ничего, и просто отображает «No Highscores Recorded Yet», - Значит, я предполагаю, что Im, создающий мою базу данных, не так? Я отредактирую в моем измененном коде сейчас –

+0

Тогда у вас что-то не так с вашим кодом, который хранится в базе данных. Можете ли вы получить доступ к базе данных в эмуляторе? где вы их сохраняете. – sfratini

+0

Как мне получить доступ к этому? –

 Смежные вопросы

  • Нет связанных вопросов^_^