NullPointerException异常的SQLiteOpenHelper.getWritableDatabase(),机器人 [英] nullPointerException for SQLiteOpenHelper.getWritableDatabase(), Android

查看:878
本文介绍了NullPointerException异常的SQLiteOpenHelper.getWritableDatabase(),机器人的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图让SQLite数据库工作在Android上。写在包括数据库的一排3 collumns输入值的MainActivity小的考验。之后,该数据被读回出并显示在屏幕上,以确认它的工作原理。

但是我收到来自logcat中的SQLiteOpenHelper.getWritableDatabase在堆栈跟踪显示空指针异常()

没有多大意义,我因为创建数据库。任何想法?

下图所示为的code两部分,扩展活动,并且拥有所有的方法创建行,从,更新读取数据库类MainActivity类,并删除。

里面的数据库类是嵌套类称为SQLiteHelper扩展SQLiteOpenHelper。

这是扩展活动MainActivity类:

 公共类MainActivity延伸活动{

按钮buttonOne;
的EditText editTextOne;
的EditText editTextTwo;
上下文语境;

@覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);

    buttonOne =(按钮)findViewById(R.id.button1);
    editTextOne =(EditText上)findViewById(R.id.edittext1);
    editTextTwo =(EditText上)findViewById(R.id.edittext2);

             //插入新行
             数据库DB =新的数据库(上下文);
             db.openToWrite();
             db.insertNewRow(1,testlabel,210);

             Toast.makeText(MainActivity.this,新行插入,Toast.LENGTH_SHORT).show();

             //显示所有行
             INT价格= 0;
            字符串名称=;
            INT状态= 0;

          字符串结果=;
            db.openToRead();
            结果= db.getAllFromDB();
            db.close();
            editTextOne.setText(结果);

} //结束的onCreate
   }
 

嵌套类SQLiteHelper扩展嵌套类内部数据库是SQLiteOpenHelper

 公共类SQLiteHelper扩展SQLiteOpenHelper {

          公共SQLiteHelper(上下文的背景下,字符串名称,
            CursorFactory工厂,INT版){
           超(背景下,名称,厂家,版本);
          }

          @覆盖
          公共无效的onCreate(SQLiteDatabase DB){
           // TODO自动生成方法存根
           db.execSQL(SCRIPT_CREATE_DATABASE);
          }

         }
    }
 

数据库类:

 公共类数据库{

    公共静态最后弦乐MYDATABASE_NAME =MY_DATABASE;
    公共静态最后弦乐MYDATABASE_TABLE =my_table的;
    公共静态最终诠释MYDATABASE_VERSION = 1;
    公共静态最后弦乐KEY_CHECKBOX_STATUS =check_box_status;
    公共静态最后弦乐KEY_CHECKBOX_LABEL =check_box_label;
    公共静态最后弦乐KEY_PRICE =价格;

  //创建表MY_DATABASE(ID整数主键,内容文字NOT NULL);
    私有静态最后弦乐SCRIPT_CREATE_DATABASE =
     CREATE TABLE+ MYDATABASE_TABLE +(+号INTEGER PRIMARY KEY AUTOINCREMENT,+
    KEY_CHECKBOX_STATUS INTEGER,+KEY_CHECKBOX_LABEL TEXT,+,KEY_PRICE INTEGER+);;

    SQLiteDatabase sqLiteDatabase;
    SQLiteHelper sqLiteHelper;
    上下文语境;

    公共数据库(上下文C){
          上下文= C;
         }

    公共无效openToRead()抛出android.database.SQLException {
          sqLiteHelper =新SQLiteHelper(背景下,MYDATABASE_NAME,空,MYDATABASE_VERSION);
          sqLiteDatabase = sqLiteHelper.getReadableDatabase();
         }

    公共无效openToWrite()抛出android.database.SQLException {
          sqLiteHelper =新SQLiteHelper(背景下,MYDATABASE_NAME,空,MYDATABASE_VERSION);
          sqLiteDatabase = sqLiteHelper.getWritableDatabase();
         }

         公共无效的close(){
         sqLiteHelper.close();
         }

    //后,这是所有获取和方法的更新和插入到数据库
 

编辑:全堆栈跟踪从logcat中添加如下:

 致命异常:
java.lang.RuntimeException的:无法启动的活动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(本机方法)
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(本机方法)
致:显示java.lang.NullPointerException
在android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
在com.example.dbtester.Database.openToWrite(Database.java:40)
在com.example.dbtester.MainActivity.onCreate(MainActivity.java:32)
android.app.Activity.performCreate(Activity.java:4465)
在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
 

解决方案

您的上下文是NULL更改数据库DB =新的数据库(上下文); 数据库DB =新的数据库(本); 的onCreate

您也应该改变你的数据库构造,这样你就不必每次都实例化 SQLiteHelper 类,你打开数据库。

 公共数据库(上下文C){
      上下文= C;
      sqLiteHelper =新SQLiteHelper(背景下,MYDATABASE_NAME,空,MYDATABASE_VERSION);
     }
 

和删除 sqLiteHelper =新SQLiteHelper(背景下,MYDATABASE_NAME,空,MYDATABASE_VERSION); openToRead() openToWrite()

I am trying to get SQLite database to work on Android. Wrote a small test in the MainActivity that consists of entering values in 3 collumns of one row of the database. after that the data is read back out and displayed to the screen to verify that it works.

however I am getting a null pointer exception shown in stacktrace from logcat for SQLiteOpenHelper.getWritableDatabase()

does not make much sense to me because the database is created. Any ideas?

shown below is both parts of the code, the MainActivity class that extends Activity and the Database class that has all the methods for create row, read from, update, and delete.

inside the Database class is a nested class called SQLiteHelper that extends SQLiteOpenHelper.

MainActivity class that extends Activity:

  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
   }

nested class SQLiteHelper extends SQLiteOpenHelper that is nested inside of Database Class

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

         }
    }

Database class:

   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

EDIT: full stacktrace from Logcat added below:

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)

解决方案

Your context is null change Database db = new Database(context); to Database db = new Database(this); in onCreate

You should also change your Database constructor so that you do not have to instantiate the SQLiteHelper class every time you open the database.

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

And remove sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION); from your openToRead() and openToWrite()

这篇关于NullPointerException异常的SQLiteOpenHelper.getWritableDatabase(),机器人的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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