当前位置:首页 > 数据库 > SQlite

SQLiteOpenHelper.getWritableDatabase()的nullPointerException,Android

我正在尝试使SQLite数据库在Android上工作.在MainActivity中编写了一个小型测试,该测试包括在数据库的一行的3个列中输入值.之后,将数据读出并显示在屏幕上以验证其是否有效.

但是我从Logcat的stacktrace中获取了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扩展了嵌套在数据库类内部的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的完整stacktrace添加如下:

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)

解决方法:

您的上下文为null change数据库db = new Database(context);到数据库db = new Database(this);在onCreate中

您还应该更改数据库构造函数,以便不必在每次打开数据库时都实例化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()


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!