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

sqlite db에 똑같은 내용의 행만 들어가요...

0 추천
package com.ㅌㅌㅌㅌ.ㅌㅌㅌㅌ;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;

public class DatabaseHandler extends SQLiteOpenHelper{
	//Database Version
	private static final int DATABASE_VERSION = 1;
	//Database Name
	private static final String DATABASE_NAME = "dataManager.db";
	// Data Table name
	private static final String TABLE_DATA = "data";
	// Data Table Columns names
	private static final String KEY_ID = "_id";
	private static final String KEY_X = "x";
	private static final String KEY_Y = "y";
	private static final String KEY_HOUR = "hour";
	private static final String KEY_DAY = "day";
	
	
	public DatabaseHandler(Context context){
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}
	
	// Creating Tables
//	@Override
	public void onCreate(SQLiteDatabase db){
		String CREATE_DATA_TABLE = "CREATE TABLE data ( _id INTEGER PRIMARY KEY AUTOINCREMENT, x DOUBLE, y DOUBLE, hour INTEGER, day INTEGER );";
	db.execSQL(CREATE_DATA_TABLE);
	}
	
	// Upgrading database
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
		// Drop older table if existed
		db.execSQL("DROP TABLE IF EXISTS "+TABLE_DATA);
		// Create tables again
		onCreate(db);
	}
	
	// Adding new data
	public void addData(Data data){
		SQLiteDatabase db = this.getWritableDatabase();
		
		ContentValues values = new ContentValues();
		values.put(KEY_X, data.getX());
		values.put(KEY_Y, data.getY());
		values.put(KEY_HOUR, data.getHour());
		values.put(KEY_DAY, data.getDay());
		
		db.insert(TABLE_DATA, null, values);
		db.close();
	}
	
	// Getting single data
	public Data getData(int id){
		SQLiteDatabase db = this.getReadableDatabase();
		
		Cursor cursor = db.rawQuery("SELECT x, y, hour, day From data", null);
		if (cursor != null)
			cursor.moveToFirst();

		Data data = new Data(cursor.getDouble(0), cursor.getDouble(1),
				Integer.parseInt(cursor.getString(2)), cursor.getInt(3)); // id, x, y, hour, day
		// return contact
		return data;
	}
	
    // Getting All Contacts
	public List<Data> getAllContacts() {
		List<Data> dataList = new ArrayList<Data>();
		// Select All Query
		String selectQuery = "SELECT  * FROM " + TABLE_DATA;
	
		SQLiteDatabase db = this.getWritableDatabase();
		Cursor cursor = db.rawQuery(selectQuery, null);
	
		// looping through all rows and adding to list
		if (cursor.moveToFirst()) {
			do {
				Data data = new Data();
				data.setID(Integer.parseInt(cursor.getString(0)));
				data.setX(cursor.getDouble(1));
				data.setY(cursor.getDouble(2));
				data.setHour(Integer.parseInt(cursor.getString(3)));
				data.setDay(cursor.getInt(4));
				// Adding contact to list
				dataList.add(data);
			} while (cursor.moveToNext());
		}
	
		// return contact list
		return dataList;
	}
	// Getting contacts Count
	public int getDataCount() {
		int count;
		String dataQuery = "SELECT  * FROM " + TABLE_DATA;
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cursor = db.rawQuery(dataQuery, null);
		count = cursor.getCount();
		cursor.close();
		// return count
		return count;
	}
	
    // Updating single contact
	public int updateData(Data data) {
		SQLiteDatabase db = this.getWritableDatabase();

		ContentValues values = new ContentValues();
		values.put(KEY_X, data.getX());
		values.put(KEY_Y, data.getY());
		values.put(KEY_HOUR, data.getHour());
		values.put(KEY_DAY, data.getDay());
		
		// updating row
		return db.update(TABLE_DATA, values, KEY_ID + " = ?",
				new String[] { String.valueOf(data.getID()) });
	}

    // Deleting single contact
	public void deleteData(int i) {
		SQLiteDatabase db = this.getWritableDatabase();
		db.delete(TABLE_DATA, KEY_ID + " = ?",
				new String[] { String.valueOf(i) });
		db.close();
	}

}

addData를 이용해 db에 값을 넣어줄때마다  실행 시 제일 먼저 db에 넣은 행과 같은 내용을 가진 행만 추가되더군요.

디버깅해서 addData에서 분명히 values에 제대로 된 값이 들어가는 것까지 확인했는데,

정작 만들어진 db파일 추출해보면 다 똑같은 내용의 행만 가지고 있어요 ㅠㅠ

왜 이럴까요... 전혀 알 수가 없네요. 도와주세요!

개발강 (120 포인트) 님이 2014년 6월 13일 질문

1개의 답변

0 추천

소스를 쭉~~ 올려놓고 아래 오류내용을 적으셨는데... 이부분 이부분이 문제라 이부분은 맞는거 같은데 이부분에 데이터가 이상하다 이렇게 해야지 그나마 답변 주는 사람도 그부분을 집중적으로 보면서 다른 여타부분을 살필텐데요.

작성자님의 머리속을 꾀뚫어 볼수도없고.. 다음번 질문하실때는 참고 하시고요.

getAllContacts()

이 메소드안의 반복문 안에서 치명적인 실수를 일단 하신 것 같네요. 일단 그게 눈에 제일 먼저 들어오는데

그게 작성자님이 하신 문제의 해결법인지는 잘 모르겠습니다.

쭈쭈총각 (17,750 포인트) 님이 2014년 6월 13일 답변
어떤 부분이 문젠지도 도저히 감을 잡을 수가 없었어요. 인터넷에서 db쓰는 법 찾아서 열심히 활용한거라.. 그래도 다른 코드부분이 아니라 이 클래스가 문제인게 확실하고 제가 보기엔 addData가 이상해보이지만 그거 말고 다른 곳에서 문제가 생긴게 결국 에러를 초래한 것 같아서 소스 전체를 올린 건데.. 그냥 항상 실행시 제일 첫번째로 넣어준 행과 똑같은 행만 들어간다 이게 제가 아는 오류의 전부라서요. 물론 이 긴 코드를 답변자님께서 성의있게 읽고 대답해주신건 정말 감사드립니다. 그런데 지금과 같은 경우는 제가 질문을 바꿔쓴다고 해도 어떻게 고쳐써야 할지 감이 안오네요. 저도 그냥 무책임하게 코드 덩어리째 올리고 고쳐주세요 이런게 아니라 스스로 몇일씩 끙끙앓고 고민하다 올린 건데...  첫 질문에 이렇게 답변을 받으니 마음이 상하네요. 저도 앞으로 질문을 더 간략하게 올리고자 고민을 많이 하겠지만, 답변자님께서도 너무 예민하게 반응하신건 아닌지 재고해주셨으면 합니다.
저 메소드 안에 문제점은 아시겠나요?
네 커서 앞으로 옮긴후에 동작 반복인데, 잘못되었네요. 그런데 다행히 어떤 곳에서도 저 메소드를 사용하지는 않습니다. 혹시나 해서 만들어둔 메소드네요.
그게 아니구요
반복문안에
Data data = new Data();
new 생성자로 메모리를 계속 생성하는게 문제에요.
저렇게 작성하시면 돌아가는 많큼 메모리 공간이 늘어납니다. 쓸대없이요.
한 메모리 공간으로도 충분히 할 수 있는걸요...
한 메모리 공간으로 할 수 있나요?
array list add 메소드가 인자 deep copy해서 array list에 넣는건가요? array list에 인자 add해주면 id자체도 동일하게 들어가던데.. array list라는 게 그냥 오브젝트 자체를 리스트로 가지고 있는거라 새 데이터 받으려면 new 해줘야 할 것 같은데요... 이 상황에선 new 안하는 게 문제가 되는 것 아닌가요?
반복문 밖에 뉴생성자로 해야죠.  그래야 한 메모리상에 있는 객체가 재활용 되면서 사용되어 지는거죠.  어차피 한번돌면 다음번 커서의 데이터가 새로 셋되니깐요. 구지 새로운 메모리를 할당할 필요가 없습니다.
말씀하신 대로 하면 모든 arraylist의 Data가 마지막 Data로 셋됩니다... 모든 행의 새로운 데이터를 arraylist에 넣으려면 new해줘야 합니다. 오브젝트의 경우 shallow copy라서요. 혹시나해서 방금 테스트해봤네요. 제가 데이터베이스와 안드로이드를 처음 써봐서 그렇지, 자바 프로그래밍은 처음이 아닙니다. 제가 묻는 부분은 db query문 관련입니다. 그 부분을 명시할걸 그랬네요. 깊은 관심과 조언 감사합니다.
...