Process: com.example.administrator.myapplication, PID: 6103
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.database.sqlite.SQLiteDatabase.execSQL(java.lang.String)' on a null object reference
at com.example.administrator.myapplication.SubActivity$4.onClick(SubActivity.java:93)
다음과 같은 사유로 에러가 뜹니다..
//DB관련 ~~~~~~
try
{
// 문자열은 ''로 감싸야 한다.
String query = String.format(
"INSERT INTO %s VALUES ( null, '%s', '%s' );", TABLE_NAME, text, text2 );
db.execSQL( query );
// 아래 메서드를 실행하면 리스트가 갱신된다. 하지만 구글은 이 메서드를 deprecate한다. 고로 다른 방법으로 해보자.
// cursor.requery();
cursor = db.rawQuery( querySelectAll, null );
myAdapter.changeCursor( cursor );
}
catch( NumberFormatException e )
{
Toast.makeText(SubActivity.this, "나이는 정수를 입력해야 합니다", Toast.LENGTH_SHORT).show();
}
이것이 에러가 나는 부분 코드입니다.. SubActivity.java:93은 db.execSQL( query ); 부분이구요..
혹시 몰라서 액티비티 전체 코드 올려봅니다 ㅠㅠ
public class SubActivity extends Activity {
//DB관련 변수 선언
SQLiteDatabase db;
Cursor cursor;
MyCursorAdapter myAdapter;
final static String TABLE_NAME = "mytable";
final static String querySelectAll = String.format( "SELECT * FROM %s", TABLE_NAME );
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sub_activity);
Button timeBtn = (Button) findViewById(R.id.timeBtn);
Button dayBtn = (Button) findViewById(R.id.dayBtn);
Button btn = (Button) findViewById(R.id.button2);
Button btn2 = (Button) findViewById(R. id. button3);
Button ringBtn = (Button) findViewById(R.id. ringBtn);
CheckBox check = (CheckBox) findViewById(R.id.checkBox);
//시간 설정 버튼 클릭 구현
timeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(SubActivity.this, DialogActivity.class);
startActivityForResult(intent, 1);
}
});
//요일 설정 버튼 클릭 구현
dayBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(SubActivity.this, DialogActivity2.class);
startActivityForResult(intent, 2);
}
});
//취소버튼 클릭 구현
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent inten = new Intent(SubActivity.this, MainActivity.class);
setResult(RESULT_OK, inten);
finish();
}
});
//확인 버튼 클릭 구현
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final Button timeBtn = (Button) findViewById(R.id.timeBtn);
final String text = timeBtn.getText().toString();
final Button dayBtn = (Button) findViewById(R.id.dayBtn);
final String text2 = dayBtn.getText().toString();
//DB관련 ~~~~~~
try
{
// 문자열은 ''로 감싸야 한다.
String query = String.format(
"INSERT INTO %s VALUES ( null, '%s', '%s' );", TABLE_NAME, text, text2 );
db.execSQL( query );
// 아래 메서드를 실행하면 리스트가 갱신된다. 하지만 구글은 이 메서드를 deprecate한다. 고로 다른 방법으로 해보자.
// cursor.requery();
cursor = db.rawQuery( querySelectAll, null );
myAdapter.changeCursor( cursor );
}
catch( NumberFormatException e )
{
Toast.makeText(SubActivity.this, "나이는 정수를 입력해야 합니다", Toast.LENGTH_SHORT).show();
}
// 저장 버튼 누른 후 키보드 안보이게 하기
InputMethodManager imm =
(InputMethodManager) getSystemService( Context.INPUT_METHOD_SERVICE );
imm.hideSoftInputFromWindow( dayBtn.getWindowToken(), 0 );
Intent inten = new Intent(SubActivity.this, MainActivity.class);
inten.putExtra("입력한 text", text);
inten.putExtra("입력한 text2", text2);
setResult(RESULT_OK, inten);
finish();
Toast.makeText(SubActivity.this, "알람이 추가되었습니다", Toast.LENGTH_SHORT).show();
}
});
//벨소리 설정 버튼 구현
ringBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
startActivityForResult(intent, 0);
}
});
//체크되면 즉시진동 구현
check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
if(isChecked)
{
Vibrator vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
vib.vibrate(700);
}
}
});
}