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

안드로이드 db execSQL 문제입니다...

0 추천

이런식으로 해서 intent로 다른 액티비티 연결한것도 데이터 가져올려고 하는데 즉, 이름과 국어,수학 성적을 받아서 다른 액티비티에 학번,이름, 국어점수, 수학점수, 총합, 평균  이렇게 띄울려고 하는데 액티비티1에서 아예 먹통이네요.. 제가 무슨 다른 변수 값을 잘못가져왔는지 도통 모르겠습니다. 데이터를 에디트 텍스트에 입력하고 입력 버튼을 누르면 데이터에 들어가서 밑에 리스트뷰에 떠야 하는데 계속 오류나서 앱이 튕기네요... 어디가 잘못됐는지 가르쳐 주십쇼. 안드로이드 쌉 고수님의 답변을 기다리겠습니다...  코드가 길어서 안올라가네요 또 올리겠습니다.

 

public class MainActivity extends AppCompatActivity {
    //위젯 멤버 변수 선언
   
EditText edtName,edtKor,edtMat;
    Button btnInit,btnInsert,btnUpdate,btnDelete,btnSelect;
    ListView    list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //위젯 참조
       
edtName = (EditText)findViewById(R.id.edtName);
        edtKor = (EditText)findViewById(R.id.edtKor);
        edtMat = (EditText)findViewById(R.id.edtMat);
        btnInit = (Button)findViewById(R.id.btnInit);
        btnInsert = (Button)findViewById(R.id.btnInsert);
        btnUpdate = (Button)findViewById(R.id.btnUpdate);
        btnDelete = (Button)findViewById(R.id.btnDelete);
        btnSelect = (Button)findViewById(R.id.btnSelect);
        list = (ListView)findViewById(R.id.list);

        //데이터 베이스 객체 생성
       
final DBHelper helper = new DBHelper(this);

        //테이블 초가화
       
btnInit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = helper.getWritableDatabase();
                helper.onUpgrade(db, 1,2);
                db.close();//열려있는 데이터베이스 닫기.
               
btnSelect.callOnClick();
            }
        });

        //데이터 입력
       
btnInsert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = helper.getWritableDatabase();
                String Name = edtName.getText().toString();
                Integer Kor = Integer.parseInt(edtKor.getText().toString());
                Integer Mat = Integer.parseInt(edtMat.getText().toString());
                //data insert
                //INSERT INTO scoreTBL VALUES(null, 'name'. 'tel');
               
db.execSQL("INSERT INTO scoreTBL VALUES(null, '" + Name +"', " +
                        "'" + Kor + "','" + Mat + "');");
                //저장 메시지
               
Toast.makeText(getApplicationContext(), "정상 추가",
                        Toast.LENGTH_SHORT).show();
                //입력 이름, 전화번호 초기화
               
edtName.setText("");
                edtKor.setText("");
                edtMat.setText("");
                btnSelect.callOnClick();
                db.close();
            }
        });

안드신이되고싶다... (120 포인트) 님이 2020년 4월 23일 질문
안드신이되고싶다...님이 2020년 4월 23일 수정
뒤에 코드는
//테이블 수정
        btnUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = helper.getWritableDatabase();
                String Name = edtName.getText().toString();
                Integer Kor = Integer.parseInt(edtKor.getText().toString());
                Integer Mat = Integer.parseInt(edtMat.getText().toString());
                //data update
                //UPDATE contacts SET tel= 'tel' WHERE name = '" + name + "';"
                db.execSQL("UPDATE scoreTBL SET gKor =  '" + Kor + "', gMat =  '" + Mat + "' " +
                        "WHERE gName = '" +  Name + "';");
                //수정 정상 처리 메시지
                Toast.makeText(getApplicationContext(), "정상 수정",
                        Toast.LENGTH_SHORT).show();
                //입력 이름, 전화번호 지우기
                edtName.setText("");
                edtKor.setText("");
                edtMat.setText("");
                btnSelect.callOnClick();
                db.close();
            }
        });

        //테이블 삭제
        btnDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = helper.getWritableDatabase();//호출하면 데이터베이스를 읽고 쓰기 할 수 있다.
                String Name = edtName.getText().toString();
                //data delete
                //DELETE FROM contacts WHERE name = 'name';"
                db.execSQL("DELETE FROM scoreTBL WHERE gName = '" + Name + "';");
                //삭제 정상 처리 메시지
                Toast.makeText(getApplicationContext(), "정상 삭제",
                        Toast.LENGTH_SHORT).show();
                //입력 이름, 전화번호 지우기(초기화)
                edtName.setText("");
                edtKor.setText("");
                edtMat.setText("");
                btnSelect.callOnClick();
                db.close();
            }
        });

        //데이터 전체 조회
        btnSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = helper.getReadableDatabase();
                //SELECT * FROM contacts;
                Cursor c = db.rawQuery("SELECT * FROM scoreTBL;", null);
                c.moveToFirst();
//                startManagingCursor(c);//c,moveToFirst()랑 결과는 동일!
                String[] from = {"_id", "gName", "gKor", "gMat"};
                int[] to = {R.id.tvNo, R.id.tvName, R.id.tvKor,R.id.tvMat};

                final SimpleCursorAdapter adapter = new SimpleCursorAdapter(list.getContext(),
                        R.layout.display,
                        c,
                        from,
                        to);
                list.setAdapter(adapter);
                //c.close();
                db.close();

                //리스트 항목 클릭하면, SecondActivity로 넘어감.
                list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        Cursor c = (Cursor)adapter.getItem(position);
//                        String msg = "이름:" + c.getString(1) +
//                                " / 전화번호:" + c.getString(2);
//                        Toast.makeText(getApplicationContext(),
//                                msg, Toast.LENGTH_SHORT).show();
                        edtName.setText(c.getString(1));
                        edtKor.setText(c.getInt(2));
                        edtMat.setText(c.getInt(3));

                        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                        intent.putExtra("pno", c.getString(1));
                        intent.putExtra("pname", c.getString(2));
                        intent.putExtra("pkor", c.getInt(3));
                        intent.putExtra("pmat", c.getInt(4));
                        intent.putExtra("ptot", c.getInt(5));
                        intent.putExtra("pavg", c.getInt(6));
                        startActivity(intent);
                    }
                });
            }
        });

    }
    //데이터베이스 사용 : SQLiteOpenHelper 상속 및 재정의
    class DBHelper extends SQLiteOpenHelper {
        //상속자 : 데이터베이스 생성
        public DBHelper(Context context){
            super(context, "scoreDB", null, 1);
        }
        //테이블 생성
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE scoreTBL(_id INTEGER PRIMARY KEY" +
                    " AUTOINCREMENT, gName CHAR(20), gKor INTEGER, gMat INTEGER);");
        }//AUTOINCREMENT - 자동증가.
        //테이블 초기화(삭제 후 생성)
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS scoreTBL");
            onCreate(db);
        }
    }
}
이렇게 입니다. 부탁드립니다. 어디가 잘못됐는지를 알고 싶습니다. 왜 앱이 튕기는지 알고 싶습니다.

1개의 답변

0 추천
정확한 건 logcat을 보면 나오긴 하겠지만..

 

DB 테이블엔 이름. 국어, 수학 점수만 있는데,

intent.putExtra("pno", c.getString(1));
intent.putExtra("pname", c.getString(2));
intent.putExtra("pkor", c.getInt(3));
intent.putExtra("pmat", c.getInt(4));
intent.putExtra("ptot", c.getInt(5));
intent.putExtra("pavg", c.getInt(6)); 호출 하시다 보니, 오류가 나는 것으로 추정됩니다.
익명사용자 님이 2020년 4월 23일 답변
...