마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

리스트뷰 DB저장 관련 에러 질문입니다..

0 추천
 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);
                }
            }
        });

    }

 

똑돌이 (530 포인트) 님이 2016년 8월 19일 질문

1개의 답변

0 추천

    final String text = timeBtn.getText().toString();

   final String text2 = dayBtn.getText().toString();

 

이거2개 null 체크먼저 해보셔야할거같네여

 

sadeva (21,550 포인트) 님이 2016년 8월 19일 답변
null이 아닌데 ㅠㅠ  혹시 다른 체크사항잇을까요
...