NullpointerException and getWritable()error on my sqlite dat



我想将一些数据保存到SQLite数据库中,但发生了错误NullpointerException,我找不到此错误请告诉我

德汉德勒.java

public class DBHandler extends SQLiteOpenHelper{
    /*public static final String TABLE_USER = "USERTABLE";
      public static final String USER_NAME = "username";
      public static final String PASSWORD = "password";
      public static final String CONFIRM_PASSWORD = "confirm_password";
      public static final String MOBILE_NO = "mobile_no";  */

    // DataBase Name
        public final static String DATABASE = "UserDetails";
        // DataBase Table Name's
        public final static String USER_TABLE = "TABLE_USER";
        // Field names of MALLS Table
        public static final String USER_NAME = "username";
        public static final String PASSWORD = "password";
        public static final String CONFIRM_PASSWORD = "confirmpassword";
        public static final String USER_MOBILE_NUMBER = "mobilenumber";
        public static final String USER_EMAIL = "email";

    private static final String LOGCAT=null;
    public DBHandler(Context context) {
        super(context, "androidsqlite.db",null, 1);
        // TODO Auto-generated constructor stub
        Log.d(LOGCAT,"Created");
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        String CREATE_TABLE_USER;    
       CREATE_TABLE_USER  = "CREATE TABLE IF NOT EXISTS "
                        + USER_TABLE+ " (" + USER_NAME
                        + " VARCHAR," + PASSWORD + " VARCHAR,"
                        + CONFIRM_PASSWORD + " VARCHAR," + USER_MOBILE_NUMBER + " VARCHAR,"
                        + USER_EMAIL+ " VARCHAR," 
                         + ")";
         Log.d(LOGCAT,"CREATE_TABLE_USER Created");
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        String query;
        query = "DROP TABLE IF EXISTS CREATE_TABLE_USER";
        db.execSQL(query);
        onCreate(db);
    }
    public void insertUserDetails(HashMap<String, String> queryValues){
        SQLiteDatabase database = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(USER_NAME, queryValues.get("username"));
        values.put(PASSWORD, queryValues.get("password"));
        values.put(CONFIRM_PASSWORD, queryValues.get("confirmPwd"));
        values.put(USER_MOBILE_NUMBER, queryValues.get("mobileNo"));
        database.insert("CREATE_TABLE_USER ", null, values);
        database.close();
    }
    } 

注册活动

public class RegistrationActivity extends Activity {
private Context context;
private EditText userNameEdt;
private EditText passwordEdt;
private EditText cnfrmPwdEdt;
private EditText contactEdt;
private Button submitBtn;
private Button cancelBtn;
private String userName;
private String pswd;
private String cnfrmPwd;
private String contactNo;

DBHandler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_registration);
    userNameEdt = (EditText)findViewById(R.id.userNameedt);
    passwordEdt = (EditText)findViewById(R.id.paswordEdit);
    cnfrmPwdEdt = (EditText)findViewById(R.id.confirmPaswordEdit);
    contactEdt  = (EditText)findViewById(R.id.mobileNoedt);
    submitBtn   =  (Button)findViewById(R.id.submitbtn);
    cancelBtn   =  (Button)findViewById(R.id.cancel);
     handler = new DBHandler(context);
    submitBtn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            userName = userNameEdt.getText().toString();
            pswd     = passwordEdt.getText().toString();
            cnfrmPwd = cnfrmPwdEdt.getText().toString();
            contactNo= contactEdt.getText().toString();
            HashMap<String, String> queryValues =  new  HashMap<String,String>();
            queryValues.put("username", userName);
            queryValues.put("password", pswd);
            queryValues.put("confrmPwd", cnfrmPwd);
            queryValues.put("contact", contactNo);
            handler.insertUserDetails(queryValues);
        }
    });

}

 }

错误

12-31 11:52:43.867: E/AndroidRuntime(820):  at   
    com.example.esecuresystrem.database.DBHandler.insertUserDetails(DBHandler.java:68)
    12-31 11:53:54.908: E/AndroidRuntime(867): FATAL EXCEPTION: main
    12-31 11:53:54.908: E/AndroidRuntime(867): java.lang.NullPointerException
    12-31 11:53:54.908: E/AndroidRuntime(867):  at    
    android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
    12-31 11:53:54.908: E/AndroidRuntime(867):  at   
    com.example.esecuresystrem.database.DBHandler.insertUserDetails(DBHandler.java:68)
    12-31 11:53:54.908: E/AndroidRuntime(867):  at   
    com.example.esecuresystrem.RegistrationActivity$1.onClick(RegistrationActivity.java:68)
    12-31 11:53:54.908: E/AndroidRuntime(867):  at           
    android.view.View.performClick(View.java:3480)

替换

handler = new DBHandler(context);
//context is only declared not initialized in activity

handler = new DBHandler(RegistrationActivity.this);

在创建DBHabdler中

db.execSQL(CREATE_TABLE_USER );  

并改变

values.put(USER_MOBILE_NUMBER, queryValues.get("contact"));

您的代码中有 4 个错误。

1.您不会在代码中的任何位置创建表。

在帮助程序类的onCreate()方法中添加此行

db.execSQL(CREATE_TABLE_USER);

您只是打印了日志消息,但没有创建任何表。

像这样改变你的方法..

 @Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    String CREATE_TABLE_USER;    
   CREATE_TABLE_USER  = "CREATE TABLE IF NOT EXISTS "
                    + USER_TABLE+ " (" + USER_NAME
                    + " VARCHAR," + PASSWORD + " VARCHAR,"
                    + CONFIRM_PASSWORD + " VARCHAR," + USER_MOBILE_NUMBER + " VARCHAR,"
                    + USER_EMAIL+ " VARCHAR," 
                     + ")";
     db.execSQL(CREATE_TABLE_USER);
     Log.d(LOGCAT,"CREATE_TABLE_USER Created");
}

2.像这样更改您的代码。

values.put(USER_MOBILE_NUMBER, queryValues.get("contact"));

3.以及对代码的再一次修改。您正在将数据插入到错误的表名中。.

 database.insert("CREATE_TABLE_USER ", null, values);

在这里,您必须通过USER_TABLE CREATE_TABLE_USER

database.insert(USER_TABLE, null, values);

4.上下文仅在活动中声明未初始化,因此替换

handler = new DBHandler(context);

handler = new DBHandler(RegistrationActivity.this);

您正在尝试使用错误的密钥从HaspMap中获取联系电话详细信息

尝试如下:

 values.put(USER_MOBILE_NUMBER, queryValues.get("contact"));

此外,您只编写了用于创建表的查询,但没有执行它,因此它可能没有创建表。并将表查询写在onCreate()之外 尝试在onCreate()中执行创建表查询,如下所示:

 String CREATE_TABLE_USER;    
   CREATE_TABLE_USER  = "CREATE TABLE IF NOT EXISTS "
                    + USER_TABLE+ " (" + USER_NAME
                    + " VARCHAR," + PASSWORD + " VARCHAR,"
                    + CONFIRM_PASSWORD + " VARCHAR," + USER_MOBILE_NUMBER + " VARCHAR,"
                    + USER_EMAIL+ " VARCHAR," 
                     + ")";
@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
     Log.d(LOGCAT,"CREATE_TABLE_USER Created");
    db.execSQL(CREATE_TABLE_USER);
}

此外,您的contextDBHandler类的RegistrationActivity中为空。在onCreate()中提供如下上下文:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_registration);
    context=RegistrationActivity.this;
    handler = new DBHandler(context);

也许这是一个导致 NullPointerException
的问题您将"联系人"放在HashMap中,但从中获得"mobileNo"

queryValues.put("contact", contactNo);
values.put(USER_MOBILE_NUMBER, queryValues.get("mobileNo"));

最新更新