SQLiteOpenHelper.getWritableDatabase(),Android的nullPointerException

时间:2013-04-12 06:47:08

标签: android database sqlite

我正在尝试让SQLite数据库在Android上运行。在MainActivity中编写了一个小测试,包括在数据库的一行的3个列中输入值。之后,数据被读回并显示在屏幕上以验证其是否有效。

但是我从logcat中获取了一个空指针异常,从logite for SQLiteOpenHelper.getWritableDatabase()

对我来说没有多大意义,因为数据库是创建的。有什么想法吗?

下面的

是代码的一部分,扩展Activity的MainActivity类和具有创建行,读取,更新和删除的所有方法的Database类。

Database类中的

是一个名为SQLiteHelper的嵌套类,它扩展了SQLiteOpenHelper。

扩展Activity的MainActivity类:

  public class MainActivity extends Activity {

Button buttonOne;
EditText editTextOne;
EditText editTextTwo;
Context context;

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

    buttonOne = (Button) findViewById(R.id.button1);
    editTextOne = (EditText) findViewById(R.id.edittext1);
    editTextTwo = (EditText) findViewById(R.id.edittext2);

             //insert new row
             Database db = new Database(context);
             db.openToWrite();
             db.insertNewRow(1, "testlabel", 210);

             Toast.makeText(MainActivity.this,"new row inserted", Toast.LENGTH_SHORT).show();

             // display all rows
             int price = 0;
            String name = "";
            int status = 0;

          String result = "";
            db.openToRead();
            result = db.getAllFromDB();
            db.close();
            editTextOne.setText(result);

} // end onCreate
   }

嵌套类SQLiteHelper扩展嵌套在Database Class中的SQLiteOpenHelper

   public class SQLiteHelper extends SQLiteOpenHelper {

          public SQLiteHelper(Context context, String name,
            CursorFactory factory, int version) {
           super(context, name, factory, version);
          }

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

         }
    }

数据库类:

   public class Database {

    public static final String MYDATABASE_NAME = "my_database";
    public static final String MYDATABASE_TABLE = "my_table";
    public static final int MYDATABASE_VERSION = 1;
    public static final String KEY_CHECKBOX_STATUS = "check_box_status";
    public static final String KEY_CHECKBOX_LABEL = "check_box_label";
    public static final String KEY_PRICE = "price"; 

  //create table MY_DATABASE (ID integer primary key, Content text not null);
    private static final String SCRIPT_CREATE_DATABASE =
     "CREATE TABLE " + MYDATABASE_TABLE + " (" + "ID INTEGER PRIMARY KEY AUTOINCREMENT, " +  
    "KEY_CHECKBOX_STATUS INTEGER, " + "KEY_CHECKBOX_LABEL TEXT, " + " KEY_PRICE INTEGER" + ");";

    SQLiteDatabase sqLiteDatabase;
    SQLiteHelper sqLiteHelper;
    Context context;

    public Database(Context c){
          context = c;
         }

    public void openToRead() throws android.database.SQLException {
          sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
          sqLiteDatabase = sqLiteHelper.getReadableDatabase();
         }

    public void openToWrite() throws android.database.SQLException {
          sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
          sqLiteDatabase = sqLiteHelper.getWritableDatabase();
         }

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

    // after this is all the methods for getting and updating and inserts to database

编辑:下面添加了Logcat的完整堆栈跟踪:

FATAL EXCEPTION:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.dbtester/com.example.dbtester.MainActivity}: java.lang.NullPointerException
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
android.app.ActivityThread.access$600(ActivityThread.java:123)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:137)
android.app.ActivityThread.main(ActivityThread.java:4424)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:511)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
dalvik.system.NativeStart.main(Native Method)
caused by: java.lang.NullPointerException
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
at com.example.dbtester.Database.openToWrite(Database.java:40)
at com.example.dbtester.MainActivity.onCreate(MainActivity.java:32)
android.app.Activity.performCreate(Activity.java:4465)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)

1 个答案:

答案 0 :(得分:4)

Database db = new Database(context);

中的上下文为空Database db = new Database(this);改为onCreate

您还应该更改Database constructor,这样每次打开数据库时都不必实例化SQLiteHelper类。

public Database(Context c){
      context = c;
      sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
     }  

sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);openToRead()

中删除openToWrite()