【问题标题】:SQLite crashes at insertSQLite 在插入时崩溃
【发布时间】:2013-06-30 20:04:56
【问题描述】:

导致异常的方法是insertdetails()

我的代码:

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class AllLevels extends Activity implements OnClickListener {

    ImageView iv1, iv2, iv3, iv4, iv5, iv6, iv7, iv8, iv9, iv10, iv11, iv12;
    TextView tv;
    MediaPlayer mp;
    DBAdapter dbAdapter;
    DBHelper dbHelper;
    SQLiteDatabase db;
    long a;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_all_levels);

        mp = MediaPlayer.create(this, R.raw.main);
        mp.start();
        mp.setLooping(true);
        Context context = this;

        final SharedPrefsHandler spf = new SharedPrefsHandler(context);
        int i = spf.loadPrefs();

        Toast.makeText(this, "Value from sharedpref"+i, Toast.LENGTH_SHORT).show();

        //creating database and entering default values

        dbHelper = new DBHelper(this);

        dbHelper.getWritableDatabase(); //Works fine till here, even database is generated.

//这就是我怀疑的问题所在,当我删除这些行时代码运行,当包含这些行时甚至不会生成数据库。

        dbAdapter.insertDetails(1, 1, 0, 0); 
        dbAdapter.insertDetails(2, 2, 0, 0);
        dbAdapter.insertDetails(3, 3, 0, 0);
        dbAdapter.insertDetails(4, 4, 0, 0);
        dbAdapter.insertDetails(5, 5, 0, 0);
        dbAdapter.insertDetails(6, 6, 0, 0);
        dbAdapter.insertDetails(7, 7, 0, 0);
        dbAdapter.insertDetails(8, 8, 0, 0);
        dbAdapter.insertDetails(9, 9, 0, 0);
        dbAdapter.insertDetails(10, 10, 0, 0);
        dbAdapter.insertDetails(11, 11, 0, 0);
        dbAdapter.insertDetails(12, 12, 0, 0);
}

package com.s.wrestlernicknames;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class DBAdapter {
    SQLiteDatabase db;
    DBHelper dbHelper;
    Context context;


    public DBAdapter(Context c) {
        this.context = c;
    }

    public DBAdapter openToRead() {
        dbHelper = new DBHelper(context);
        db = dbHelper.getReadableDatabase();
        return this;
    }

    public DBAdapter openToWrite() {
        dbHelper = new DBHelper(context);
        db = dbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        db.close();
    }

    public long insertDetails(int id, int level, int totalTime, int score) {//Function that is being called to insert the values.
        ContentValues contentValues = new ContentValues();
        contentValues.put(DBHelper.C_ID, id);
        contentValues.put(DBHelper.LEVEL, level);
        contentValues.put(DBHelper.TIME, totalTime);
        contentValues.put(DBHelper.SCORE, score);
        openToWrite();
        long val = db.insert(DBHelper.TABLE_NAME, null, contentValues);
        close();
        return val;
    }

    public Cursor queryName() {
        String[] column = {DBHelper.C_ID, DBHelper.LEVEL, DBHelper.TIME, DBHelper.SCORE};
        openToWrite();
        Cursor cursor = db.query(DBHelper.TABLE_NAME, column, null, null, null, null, null);
        return cursor;
    }

    public long updateDetails(int id, int level, int totalTime, int score) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(DBHelper.C_ID, id);
        contentValues.put(DBHelper.LEVEL, level);
        contentValues.put(DBHelper.TIME, totalTime);
        contentValues.put(DBHelper.SCORE, score);
        openToWrite();
        long val = db.update(DBHelper.TABLE_NAME, contentValues, DBHelper.C_ID+"="+id, null);
        close();
        return val;
    }
}

生成数据库的类:

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "data";
    public static final String TABLE_NAME = "score_table";
    public static final String C_ID = "_id";
    public static final String LEVEL = "level";
    public static final String SCORE = "score";
    public static final String TIME = "time";
    public static final int VERSION = 1;

    private final String createDB = "create table if not exists "+ TABLE_NAME + "("
            + C_ID + " integer primary key, "
            + LEVEL + " integer, "
            + SCORE + " integer, "
            + TIME + " integer ); ";

    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, VERSION);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL(createDB);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("drop table "+ TABLE_NAME);
    }

}

堆栈跟踪:

07-01 01:01:28.429: E/AndroidRuntime(1193): FATAL EXCEPTION: main
07-01 01:01:28.429: E/AndroidRuntime(1193): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.s.wrestlernicknames/com.s.wrestlernicknames.AllLevels}: java.lang.NullPointerException
07-01 01:01:28.429: E/AndroidRuntime(1193):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
07-01 01:01:28.429: E/AndroidRuntime(1193):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
07-01 01:01:28.429: E/AndroidRuntime(1193):     at android.app.ActivityThread.access$600(ActivityThread.java:122)
07-01 01:01:28.429: E/AndroidRuntime(1193):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
07-01 01:01:28.429: E/AndroidRuntime(1193):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-01 01:01:28.429: E/AndroidRuntime(1193):     at android.os.Looper.loop(Looper.java:137)
07-01 01:01:28.429: E/AndroidRuntime(1193):     at android.app.ActivityThread.main(ActivityThread.java:4340)
07-01 01:01:28.429: E/AndroidRuntime(1193):     at java.lang.reflect.Method.invokeNative(Native Method)
07-01 01:01:28.429: E/AndroidRuntime(1193):     at java.lang.reflect.Method.invoke(Method.java:511)
07-01 01:01:28.429: E/AndroidRuntime(1193):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-01 01:01:28.429: E/AndroidRuntime(1193):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-01 01:01:28.429: E/AndroidRuntime(1193):     at dalvik.system.NativeStart.main(Native Method)
07-01 01:01:28.429: E/AndroidRuntime(1193): Caused by: java.lang.NullPointerException
07-01 01:01:28.429: E/AndroidRuntime(1193):     at com.s.wrestlernicknames.AllLevels.onCreate(AllLevels.java:53)
07-01 01:01:28.429: E/AndroidRuntime(1193):     at android.app.Activity.performCreate(Activity.java:4465)
07-01 01:01:28.429: E/AndroidRuntime(1193):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
07-01 01:01:28.429: E/AndroidRuntime(1193):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
07-01 01:01:28.429: E/AndroidRuntime(1193):     ... 11 more
07-01 01:01:31.259: I/Process(1193): Sending signal. PID: 1193 SIG: 9

我已经检查了很多东西,比如 close() 语句、语法、结构等。任何帮助将不胜感激。我知道我犯了一些基本错误,只是找不到。

【问题讨论】:

  • 好吧,它显然在插入时崩溃了。请编辑您的帖子并包含堆栈跟踪
  • 你能把try catch块放在insertDetails方法中并记录异常的堆栈跟踪吗?出于某种原因,这个堆栈跟踪并没有告诉你出了什么问题
  • 看起来你的 oncreate 中有一个空值

标签: android sqlite nullpointerexception


【解决方案1】:

我没明白是什么问题,建议为我们放置 LogCat 注册表 反正 这是错误的:

    private final String createDB = "create table if not exists "+ TABLE_NAME + "("
        + C_ID + " integer primary key, "
        + LEVEL + " integer, "
        + SCORE + " integer, "
        + TIME + " integer ); ";

改成:

     private final String createDB = "create table if not exists "+ TABLE_NAME + " ("
        + C_ID + " integer primary key, "
        + LEVEL + " integer, "
        + SCORE + " integer, "
        + TIME + " integer " + ");");

【讨论】:

    【解决方案2】:

    你需要将 opentowrite() 的返回值赋值给 db

    db = openToWrite();
    long val = db.insert(DBHelper.TABLE_NAME, null, contentValues);
    

    【讨论】:

    • 它的成员变量,所以它已经在openToWrite中初始化了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多