2013-01-03 4 views
1

Android 태그를 따르는 사용자라면 누구나 나에게 친숙 할 것입니다. 내 최고 기록을 위해 SQLite 데이터베이스를 구현하는 데 가장 힘든 시간을 보내고 있습니다. 이것은 SQLite로 작업 한 첫 번째 사례이기도합니다.SQLite에 삽입하려고 할 때 NullPointerException이 발생했습니다 - Android

int와 long 두 변수 만 삽입하려고합니다. 내 insert() 메서드가 올바르게 작동하지 않습니다. 위에 언급 된 내용 이외의 조언도 환영합니다.

도움을 주셔서 감사합니다.

는 Highscores.java

public class Highscores extends Activity { 

    DatabaseHelper dh; 
    SQLiteDatabase db; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.highscoresmain); 

     dh = new DatabaseHelper(this); 
     dh.openDB(db); 
     long x = 11; 
     int y = 22; 

     TextView rank = (TextView)findViewById(R.id.rank); 
     TextView percentage = (TextView)findViewById(R.id.percentage); 
     TextView score = (TextView)findViewById(R.id.score); 

     TextView r1r = (TextView)findViewById(R.id.r1r); 
     TextView r1p = (TextView)findViewById(R.id.r1p); 
     TextView r1s = (TextView)findViewById(R.id.r1s); 

     dh.insert(x, y, db); //Line 55 
     scores = dh.getScore(db); 
     percentages = dh.getPercentage(db); 

     rank.setText("Rank Column - TEST"); 
     percentage.setText("Percentage Column - TEST "); 
     score.setText("Score Column - Test"); 
     r1r.setText("test..rank"); 
     r1p.setText("" + percentages); 
     r1s.setText("test..score"); 

     table = (TableLayout)findViewById(R.id.tableLayout); 

     dh.closeDB(db); 
    } 
} 

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper { 

    SQLiteDatabase db; 

    // Table columns names. 
    private static final String RANK = "_id"; 
    private static final String SCORE = "score"; 
    private static final String PERCENTAGE = "percentage"; 

    public DatabaseHelper(Context context) { 
     super(context, DB_NAME, null, DATABASE_VERSION); 
    } 

    public SQLiteDatabase openDB(SQLiteDatabase db) { 
     db = this.getWritableDatabase(); 
     return db; 
    } 

    public int getPercentage(SQLiteDatabase db) { 
     //Cursor c = db.rawQuery("SELECT " + PERCENTAGE + " FROM " + TABLE + " WHERE " + PERCENTAGE + " = " + 22 + ";", null); 
     Cursor c = db.rawQuery("SELECT " + PERCENTAGE + " FROM " + TABLE + ";", null); 
     int i = 0; 
     if(c.getCount() == 0) { 
      i = 333; 
     } else if (c.getCount() == 1) { 
      i = 444; 
     } else { 
      i = 888; 
       /*c.moveToFirst(); 
       int columnIndex = c.getInt(c.getColumnIndex("PERCENTAGE")); 
       if(columnIndex != -1) { 
        i = c.getInt(columnIndex); 
       } else { 
        i = 999; 
       }*/ 
     } 
     c.close(); 
     return i; 
    } 

    //Insert new record. 
    public long insert(long score, int percentage, SQLiteDatabase db) { 
     ContentValues values = new ContentValues(); 
     values.put(SCORE, score); 
     values.put(PERCENTAGE, percentage); 

     return db.insert(TABLE, null, values); //Line 120 
    } 

    public synchronized void closeDB(SQLiteDatabase db) { 
     if(db != null) { 
      db.close(); 
     } 
     super.close(); 
    } 

    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE " + TABLE + " (" 
       + RANK + " INTEGER PRIMARY KEY AUTOINCREMENT," 
       + SCORE + " LONG," 
       + PERCENTAGE + " INTEGER" 
       + ");"); 
} 

이 줄에 로그 캣 출력

01-03 17:09:18.232: E/AndroidRuntime(1712): FATAL EXCEPTION: main 
01-03 17:09:18.232: E/AndroidRuntime(1712): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.Highscores}: java.lang.NullPointerException 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at android.os.Looper.loop(Looper.java:137) 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at java.lang.reflect.Method.invoke(Method.java:511) 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at dalvik.system.NativeStart.main(Native Method) 
01-03 17:09:18.232: E/AndroidRuntime(1712): Caused by: java.lang.NullPointerException 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at com.example.test.DatabaseHelper.insert(DatabaseHelper.java:120) 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at com.example.test.Highscores.onCreate(Highscores.java:55) 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at android.app.Activity.performCreate(Activity.java:5104) 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
01-03 17:09:18.232: E/AndroidRuntime(1712):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
01-03 17:09:18.232: E/AndroidRuntime(1712):  ... 11 more 

답변

4

, 당신은 DB 엽니 다

dh.openDB(db); 
,536,

데이터베이스의 멤버 변수를 DatabaseHelper.db에 저장합니다 (단, 그 밖의 위치는 없으며 특히 Highscores.db에는 없음). 그런 다음 전화 : Highscores에서 nulldb 객체를 사용

dh.insert(x, y, db); 

. 마지막으로, insert() 내에서,이 nulldb 객체를 사용

당신이 대신 할 일은 당신의 insert() 방법으로 다음을 사용하다
return db.insert(TABLE, null, values); 

:

public long insert(long score, int percentage) { // Remove db parameter 
    ContentValues values = new ContentValues(); 
    values.put(SCORE, score); 
    values.put(PERCENTAGE, percentage); 

    return db.insert(TABLE, null, values); // This will use the member variable 
} 

다음, 대신 dh.insert(x, y);를 호출합니다.

openDB(SQLiteDatabase db)openDB()으로 변경하여 올바른 DB를 기록해야합니다. 그것은 그대로 로컬 변수의 값을 덮어 씁니다 (함수의 범위가 완료되면 아무 것도 변경되지 않습니다). 대신

dh.openDB(db); 

+0

나는 모든 것을 통합했다. 행에서 SELECT를 모두 시도 할 때 커서 및 rawQuery에서 NullPointerException이 발생합니다. 아무것도 삽입되지 않았다는 것을 의미하지 않습니까? – Matt

+0

@ user1866707 다시, 거기에 같은 문제가 -'db' 개체에 전달하지 마십시오 (및 메서드 매개 변수에서 제거). 'DatabaseHelper' 클래스 안에있는'db' 객체를 사용하고 싶습니다. – Eric

1

db = dh.openDB(db); 

합니다 (openDB 방법은 정말 인수가 필요하지 않지만). openDB에 대한 호출은 데이터베이스 개체 참조를 db에 저장하지 않으므로 dh.insert(..., db);을 호출 할 때 NULL입니다.

관련 문제