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

안드로이드 DB 오류나는 이유가 뭘까요?

0 추천

일단 DBManager 클래스에있는 테이블 생성하는 부분이고요.

 public void onCreate(SQLiteDatabase db) {
        // 새로운 테이블을 생성한다.
        // create table 테이블명 (컬럼명 타입 옵션);
        db.execSQL("CREATE TABLE IF NOT EXISTS MILEDDD_LIST( _id INTEGER PRIMARY KEY AUTOINCREMENT, date TEXT, total_mileage INTEGER, refuel_sum INTEGER, l_sum INTEGER, mileage INTEGER);");
    }

그리고 이건 DBManager 클래스에서 테이블에 있는 데이터를 화면에 뿌려주는거고

public String PrintData() {
        SQLiteDatabase db = getReadableDatabase();
        String str = "";
        
        Cursor cursor = db.rawQuery("select * from MILEDDD_LIST", null);
        while(cursor.moveToNext()) {
            str += "일시 : "
                + cursor.getString(1)
                + ", 총 주행거리 = "
                + cursor.getInt(2)
                + ", 주유 금액 = "
                + cursor.getInt(3)
                + ", 리터당 가격 = "
                + cursor.getInt(4)
                + ", 연비 = "
                + cursor.getInt(5)

                + "\n";
        } 
        return str;
    }

이게 데이터 입력받는 화면에서의 insert문 입니다.

final DBManager dbManager = new DBManager(getApplicationContext(), "miled.db", null, 1);
       
        // DB에 저장 될 속성을 입력받는다
        final EditText et_date = (EditText) findViewById(R.id.et_date);
        final EditText et_total_mileage = (EditText) findViewById(R.id.et_total_mileage);
        final EditText et_refuel_sum = (EditText) findViewById(R.id.et_refuel_sum);
        final EditText et_l_sum = (EditText) findViewById(R.id.et_l_sum);
        final EditText et_mileage = (EditText) findViewById(R.id.et_mileage);
        
        // 쿼리 결과 입력
        final TextView tvResult = (TextView) findViewById(R.id.tv_result);
 
        // Insert
        Button btnInsert = (Button) findViewById(R.id.btn_insert);
        btnInsert.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // insert into 테이블명 values (값, 값, 값...);
                String str_date = et_date.getText().toString();
                String str_total_mileage = et_total_mileage.getText().toString();
                String str_refuel_sum = et_refuel_sum.getText().toString();
                String str_l_sum = et_l_sum.getText().toString();
                String str_mileage = et_mileage.getText().toString();
                dbManager.insert("insert into MILEDDD_LIST values(null, '" + str_date + "', " + str_total_mileage + ", " + str_refuel_sum + ", " + str_l_sum + ", " + str_mileage + ");");
                tvResult.setText( dbManager.PrintData() );
            }
        });

 

문제는 빨간색으로 써놓은걸 빼면 잘돌아가는데 빨간색부분을 추가하고 데이터를 입력하고 추가한다는

버튼을 누르면 오류가 나면서 꺼지는데 왜 그런지 이유를 못찾겠습니다...

그리고 다른화면 갔다가 다시 데이터베이스에 추가하는 화면으로 오면 기존에 추가해놨던 데이터들이

안보였다가 새로운데이터를 추가하면 기존에있던거랑 추가되서 다 보여지는데 처음부터 보여지게 하려면

어떻게해야하나요?

그리고 데이터를 텍스트뷰가아닌 리스트뷰로 받고 싶은데 리스트뷰사용하려면 이것도 ArrayAdapter를

사용해야하는거죠?

노안드 (180 포인트) 님이 2016년 10월 11일 질문

1개의 답변

0 추천

column인덱스는 0부터 입니다.

 

 + cursor.getString(1)
                + ", 총 주행거리 = "
                + cursor.getInt(2)
                + ", 주유 금액 = "
                + cursor.getInt(3)
                + ", 리터당 가격 = "
                + cursor.getInt(4)
                + ", 연비 = "
                + cursor.getInt(5)

                + "\n";

 

이거를 

 + cursor.getString(0)
                + ", 총 주행거리 = "
                + cursor.getInt(1)
                + ", 주유 금액 = "
                + cursor.getInt(2)
                + ", 리터당 가격 = "
                + cursor.getInt(3)
                + ", 연비 = "
                + cursor.getInt(4)

                + "\n";

 

이렇게 해보세요.

Development Guy (70,570 포인트) 님이 2016년 10월 11일 답변
안되네요... 그리고 cursor.getString(1) 를 1부터 준거는 0번째 인덱스는 기본키 _id를 넣었구요... 그거 안나오게 하려고해서 그런거에요. 위에 써놓은대로 빨간부분을 빼고  돌리면 잘돌아가요... 그때도 역시 인덱스를 기본키를 제외하고 출력하려고 1부터줬고요...
그럼 혹시 crash났을때 에러 메시지좀 올려주실수 있을까요? 그거를 보면 정확한 문제 파악에 도움이 될거 같네요.
그게 복사가 안되서 다쓰지는 못하겟는데 맨처음부분에 테이블을 찾을수없다고 나오는거 같아요... 희안한게 변수2개만 출력할때는 잘되는데 뒤에 3개 더붙여서 하면 오류가 나는게 이해가안되네요...
저렇게 인덱스를 하드코딩하지말고 cursor.getcolumnindex 함수로 직접 index를 찾아서도 해보시고 처음에 cursor.getcolumnnames 함수로 컬럼이 맞게  되어있는지 확인도 해보시기 바랍니다
cursor.getcolumnindex함수는 insert부분에 추가해줘야하나요?
insert문  대신 cursor.getcolumnindex(필드) = et_date.getText().toString(); 식으로 해주면되나요?
...