NullPointerException异常时试图插入SQLite的 - Android电子 [英] NullPointerException when trying to insert into SQLite - Android

查看:137
本文介绍了NullPointerException异常时试图插入SQLite的 - Android电子的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

任何人谁如下Android的标签可能熟悉我。我有困难的时候给我高分实施SQLite数据库。这也是我第一次工作的SQLite。

我想只插入两个变量 - int和长。我的插入()方法无法正常工作。不是东西上面谈到的其他任何意见,也AP preciated。

感谢您提前对您有所帮助。

Highscores.java

 公共类榜延伸活动{    DatabaseHelper DH;
    SQLiteDatabase分贝;    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){        super.onCreate(savedInstanceState);
        的setContentView(R.layout.highscoresmain);        DH =新DatabaseHelper(本);
        dh.openDB(DB);
        长×= 11;
        诠释Y = 22;        TextView中排名=(的TextView)findViewById(R.id.rank);
        TextView的百分比=(的TextView)findViewById(R.id.percentage);
        TextView的分数=(的TextView)findViewById(R.id.score);        TextView的R1R =(的TextView)findViewById(R.id.r1r);
        TextView的r1p =(的TextView)findViewById(R.id.r1p);
        TextView的多个R1 =(的TextView)findViewById(R.id.r1s);        dh.insert(X,Y​​,DB); // 55号线
        分数= dh.getScore(DB);
        百分比= dh.getPercentage(DB);        rank.setText(等级列 - TEST);
        percentage.setText(百分比列 - TEST);
        score.setText(score列 - 测试);
        r1r.setText(test..rank);
        r1p.setText(+百分比);
        r1s.setText(test..score);        表=(TableLayout)findViewById(R.id.tableLayout);        dh.closeDB(DB);
    }
}

DatabaseHelper.java

 公共类DatabaseHelper扩展SQLiteOpenHelper {    SQLiteDatabase分贝;    //表列名。
    私有静态最后弦乐RANK =_id;
    私有静态最后弦乐分数=得分;
    私有静态最后弦乐百分比=百分比;    公共DatabaseHelper(上下文的背景下){
        超(背景下,DB_NAME,空,DATABASE_VERSION);
    }    公共SQLiteDatabase openDB(SQLiteDatabase DB){
        DB = this.getWritableDatabase();
        返回分贝;
    }    公众诠释getPercentage(SQLiteDatabase DB){
        //光标C = db.rawQuery(选择+百分比+FROM+ TABLE +WHERE+百分比+=+ 22 +;,NULL);
        光标C = db.rawQuery(选择+百分比+FROM+ TABLE +;,NULL);
        INT I = 0;
        如果(c.getCount()== 0){
            I = 333;
        }否则如果(c.getCount()== 1){
            I = 444;
        }其他{
            I = 888;
               /*c.moveToFirst();
               INT参数:columnIndex = c.getInt(c.getColumnIndex(百分比));
               如果(参数:columnIndex!= -1){
                   I = c.getInt(参数:columnIndex);
               }其他{
                   I = 999;
               } * /
        }
        c.close();
        返回我;
   }    //插入新记录。
    众长刀片(长成绩,诠释百分比,SQLiteDatabase DB){
        ContentValues​​值=新ContentValues​​();
        values​​.put(SCORE,分);
        values​​.put(百分比,百分比);        返回db.insert(TABLE,空,价值); // 120线
    }    公共同步无效closeDB(SQLiteDatabase DB){
        如果(DB!= NULL){
            db.close();
        }
        super.close();
    }    公共无效的onCreate(SQLiteDatabase DB){
        db.execSQL(CREATE TABLE+ TABLE +(
                + RANK +INTEGER PRIMARY KEY AUTOINCREMENT
                + SCORE +龙
                +百分比+INTEGER
                +););
}

LogCat中输出

  01-03 17:09:18.232:E / AndroidRuntime(1712):致命异常:主要
01-03 17:09:18.232:E / AndroidRuntime(1712):了java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.test / com.example.test.Highscores}:显示java.lang.NullPointerException
01-03 17:09:18.232:E / AndroidRuntime(1712):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
01-03 17:09:18.232:E / AndroidRuntime(1712):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
01-03 17:09:18.232:E / AndroidRuntime(1712):在android.app.ActivityThread.access $ 600(ActivityThread.java:141)
01-03 17:09:18.232:E / AndroidRuntime(1712):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1234)
01-03 17:09:18.232:E / AndroidRuntime(1712):在android.os.Handler.dispatchMessage(Handler.java:99)
01-03 17:09:18.232:E / AndroidRuntime(1712):在android.os.Looper.loop(Looper.java:137)
01-03 17:09:18.232:E / AndroidRuntime(1712):在android.app.ActivityThread.main(ActivityThread.java:5039)
01-03 17:09:18.232:E / AndroidRuntime(1712):在java.lang.reflect.Method.invokeNative(本机方法)
01-03 17:09:18.232:E / AndroidRuntime(1712):在java.lang.reflect.Method.invoke(Method.java:511)
01-03 17:09:18.232:E / AndroidRuntime(1712):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)
01-03 17:09:18.232:E / AndroidRuntime(1712):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-03 17:09:18.232:E / AndroidRuntime(1712):在dalvik.system.NativeStart.main(本机方法)
01-03 17:09:18.232:E / AndroidRuntime(1712):因:显示java.lang.NullPointerException
01-03 17:09:18.232:E / AndroidRuntime(1712):在com.example.test.DatabaseHelper.insert(DatabaseHelper.java:120)
01-03 17:09:18.232:E / AndroidRuntime(1712):在com.example.test.Highscores.onCreate(Highscores.java:55)
01-03 17:09:18.232:E / AndroidRuntime(1712):在android.app.Activity.performCreate(Activity.java:5104)
01-03 17:09:18.232:E / AndroidRuntime(1712):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
01-03 17:09:18.232:E / AndroidRuntime(1712):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
01-03 17:09:18.232:E / AndroidRuntime(1712):11 ...更多


解决方案

在这一行,你打开DB:

  dh.openDB(DB);

本存储数据库的成员变量在 DatabaseHelper.db (但在其他地方,特别是在没有 Highscores.db )。然后,您拨打:

  dh.insert(X,Y​​,DB);

使用从 A 分贝对象。最后,在插入(),您使用此 分贝对象:

 返回db.insert(TABLE,空,价值);

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

 众长插入(长成绩,诠释百分比){//删除数据库参数
    ContentValues​​值=新ContentValues​​();
    values​​.put(SCORE,分);
    values​​.put(百分比,百分比);    返回db.insert(TABLE,空,价值); //这将使用成员变量
}

然后,调用 dh.insert(X,Y​​); 而不是

您还应该更改 openDB(SQLiteDatabase DB) openDB()使得它写正确的DB ;因为它的立场,它只是覆盖本地变量的值(一次函数的范围做了哪些改变不了什么)。

Anyone who follows Android tags are probably familiar with me. I am having the hardest time implementing a SQLite database for my highscores. This is also my first time working with SQLite.

I am trying to insert just two variables -- int and long. My insert() method is not working correctly. Any advice other than the stuff talked about above is also appreciated.

Thank you in advance for your help.

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 output

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

解决方案

On this line, you open the DB:

dh.openDB(db);

This stores the member variable of the database in DatabaseHelper.db (but nowhere else, and particularly not in Highscores.db). Then, you call:

dh.insert(x, y, db);

Using a null db object from Highscores. Lastly, within insert(), you use this null db object:

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

What you should do instead is use the following as your insert() method:

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
}

Then, call dh.insert(x, y); instead.

You should also change openDB(SQLiteDatabase db) to openDB() so that it is writing the correct DB; as it stands, it just overwrites the local variable's value (which changes nothing once the function's scope is done).

这篇关于NullPointerException异常时试图插入SQLite的 - Android电子的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆