com.examples.AddAppointment.addEvent(AddAppointment.java:125)上的空指针异常
我得到这个错误空指针异常com.examples.AddAppointment.addEvent(AddAppointment.java:125)上的空指针异常,java,android,sqlite,nullpointerexception,Java,Android,Sqlite,Nullpointerexception,我得到这个错误空指针异常 小背景 我有一个主类,添加约会类和appointmentdata类。 appointmentData类有一个方法,如果数据库(SQLite)不存在,它将创建该数据库。AddAppointment类从具有成对editText的视图中获取值,用户插入一些值,并且该数据应传递给将值插入数据库的同一类中的方法addEvent,该类是在appointmentData类中创建的。但是,约会数据类从未被调用,因此数据库从未被创建,因此我得到空指针异常(值不能插入到数据库中) 现在我的
小背景
我有一个主类,添加约会类和appointmentdata类。 appointmentData类有一个方法,如果数据库(SQLite)不存在,它将创建该数据库。AddAppointment类从具有成对editText的视图中获取值,用户插入一些值,并且该数据应传递给将值插入数据库的同一类中的方法addEvent,该类是在appointmentData类中创建的。但是,约会数据类从未被调用,因此数据库从未被创建,因此我得到空指针异常(值不能插入到数据库中)
现在我的问题是。如何在main类中调用class appointmentData,以便调用onCreate方法并创建数据库。
下面的代码
任命MetData类
public class AppointmentsData extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "appointments.dba";
private static final int DATABASE_VERSION = 1;
private String TIME;
private String DESCRIPTION;
private String DETAILS;
private String DATE;
//create helper object for events database
public AppointmentsData(Context ctx){
super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_NAME + " ("
+ _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ TIME + " TEXT NOT NULL,"
+ DATE + " TEXT NOT NULL"
+ DESCRIPTION + " TEXT NOT NULL"
+ DETAILS + " TEXT NOT NULL");
}
}
添加约会类public class AddAppointment extends Activity implements OnClickListener {
private AppointmentsData events;
private EditText appDesctription;
private EditText appDate;
private EditText appTime;
private EditText appDetails;
SQLiteDatabase myDB;
//Connection conn; //A connection (session) with a specific database
ResultSet rs; //A table of data representing a database result set, which is usually generated by executing a statement that queries the database.
PreparedStatement pst; //An ob
String TableName = "appointments";
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.appointment_details);
appDate = (EditText) this.findViewById(R.id.appDate);
appDate.setKeyListener(null);
Bundle extras = getIntent().getExtras();
if(extras !=null) {
String dateSelected = extras.getString("dateselected");
appDate.setText(dateSelected);
View saveAppointment = findViewById(R.id.buttonSave);
saveAppointment.setOnClickListener(this);
//SQLiteDatabase db = dbHelper.getWritableDatabase();
}
}
private String DESCRIPTION;
private String DATE;
private String TIME;
private String DETAILS;
@Override
public void onClick(View v) {
appDesctription = (EditText) this.findViewById(R.id.appDescription);
DESCRIPTION = appDesctription.getText().toString();
appTime = (EditText) this.findViewById(R.id.appTime);
TIME = appTime.getText().toString();
appDetails = (EditText) this.findViewById(R.id.appDetails);
DETAILS = appDetails.getText().toString();
DATE = appDate.getText().toString();
AddAppointment aa = new AddAppointment();
aa.addEvent(DESCRIPTION);
aa.addEvent(DATE);
aa.addEvent(DETAILS);
aa.addEvent(TIME);
Intent j = new Intent(this, CalendarViewActivity.class);
startActivity(j);
}
private void addEvent(String string) {
//insert a new record into Events data source
//would do something similar for delete and update
SQLiteDatabase db = events.getWritableDatabase();
ContentValues values = new ContentValues();
// add key and value
values.put(DESCRIPTION, string);
values.put(DATE, string);
values.put(TIME, string);
values.put(DETAILS, string);
db.insertOrThrow(TABLE_NAME, null, values);
}
private String[] FROM = { _ID, TIME, DESCRIPTION, };
private static String ORDER_BY = _ID + "DESC";
private Cursor getEvents(){
//perform managed query. The activity will handle closing
//and requerying the cursor when needed
SQLiteDatabase db = events.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, FROM ,null, null, null, null, ORDER_BY);
startManagingCursor(cursor);
return cursor;
}
enter code here
我认为您的问题是在SQLiteOpenHelper子类中的
onCreate()
方法中有不正确的DML
语句
在这里:
日期和说明列后面缺少逗号,语句末尾的最后一个右括号也缺少逗号。这就是从未创建数据库的原因。尝试修复它,它应该会工作
下面是更正的声明:
"CREATE TABLE " + TABLE_NAME + " ("
+ _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ TIME + " TEXT NOT NULL,"
+ DATE + " TEXT NOT NULL,"
+ DESCRIPTION + " TEXT NOT NULL,"
+ DETAILS + " TEXT NOT NULL)"
它仍然没有解决问题。但是我已经废弃了整个代码,重新编写了它。这一次是以更有效的方式进行的。我只是创建了数据库处理程序类(负责所有CRUID)约会类(set和get方法),现在只要在其他类中调用适当的CRUID:)。我认为这种方法比原始问题中的方法要好得多
"CREATE TABLE " + TABLE_NAME + " ("
+ _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ TIME + " TEXT NOT NULL,"
+ DATE + " TEXT NOT NULL,"
+ DESCRIPTION + " TEXT NOT NULL,"
+ DETAILS + " TEXT NOT NULL)"