2013-01-03 120 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" 
       + ");"); 
} 

logcat的输出

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

这将数据库的成员变量存储在DatabaseHelper.db(但其他地方,尤其是不在Highscores.db中)。然后,您拨打:

dh.insert(x, y, db); 

Highscores使用nulldb对象。最后,内insert(),您使用此nulldb对象:

return db.insert(TABLE, null, values); 

你应该做的,而不是为使用以下内容作为insert()方法:

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;因为它只是覆盖局部变量的值(一旦函数的作用域完成,它就不会改变)。

+0

我整合了上述所有内容。我现在在我的游标和rawQuery上得到一个NullPointerException,当我试图从一行中选择所有。这不是说没有插入任何东西吗? – Matt

+0

@ user1866707同样,同样的问题 - 不要传入'db'对象(并将其从方法参数中移除)。你想使用'DatabaseHelper'类中的'db'对象。 – Eric

1

而不是

dh.openDB(db); 

db = dh.openDB(db); 

(虽然openDB方法真的不需要有一个参数)。您拨打openDB不会将数据库对象引用存储在db中,因此当您拨打dh.insert(..., db);时,它将为NULL。

相关问题