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

SQLite를 사용할 때, 다른 activity에서 사용할 때, 무조건 open()을 해주어야되나요?

0 추천
public class DataBaseAdapter {
	// table에 들어갈 컬럼값
	public static final String KEY_ROWID = "id";
	public static final String KEY_NAME = "name";
	public static final String KEY_SEX = "sex";
	public static final String KEY_YEAR = "year";
	public static final String KEY_HEIGHT = "height";
	public static final String KEY_WEIHGT = "weight";
	public static final String KEY_LOSS_WEIGHT = "loss_weight";
	public static final String KEY_AVG_WEIGHT = "avg_weight";
	public static final String KEY_BM = "bm";
	public static final String KEY_BMI = "bmi";

	// DataBaseHelper와 SQLDatabase객체 정의(SQLiteDatabase : 추가, 삭제, 쿼리, 수정과 관련)
	private DataBaseHelper mDBHelper;
	private SQLiteDatabase mDB;

	// Create Table 정의
	private static final String DB_CREATE = "create table userinfo (id integer primary key autoincrement,"
			+ "name text not null, sex text, year Integer, height Integer, weight Integer, loss_weight Integer, avg_weight Integer, bm Integer, bmi Integer);";

	// SQLiteOpenHelper Values
	private static final String DATABASE_NAME = "checkmybody.db";
	private static final String DATABASE_TABLE = "userinfo";
	private static final int DATABASE_VERSION = 1;

	private final Context mContext;

	// SQLiteOpenHelper 정의(SQLiteOpenHelper : 생성, 열기, 업데이트와 관련)
	private class DataBaseHelper extends SQLiteOpenHelper {

		public DataBaseHelper(Context context) {
			super(context, DATABASE_NAME, null, DATABASE_VERSION);
		}

		// table 생성
		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL(DB_CREATE);
		}

		// db업데이트
		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
			onCreate(db);
		}
	}

	public DataBaseAdapter(Context context) {
		mContext = context;
	}

	// DB열기
	public DataBaseAdapter open() {
		mDBHelper = new DataBaseHelper(mContext);
		try {
			mDB = mDBHelper.getWritableDatabase();
		} catch (SQLiteException ex) {
			mDB = mDBHelper.getReadableDatabase();
		}
		return this;
	}

	// DB 닫기
	public void close() {
		mDBHelper.close();
	}

	// 모든 필드값 삭제
	public void initialTable() {
		mDB.execSQL("DELETE FROM " + DATABASE_TABLE+";");
	}

	// 필드값 insert
	public long insertUserInfo(String name, String sex, float year,
			float height, float weight, float lossWeihgt, float avgWeight,
			float BM, float BMI) {
		ContentValues initialValues = new ContentValues();
		initialValues.put(KEY_NAME, name);
		initialValues.put(KEY_SEX, sex);
		initialValues.put(KEY_YEAR, year);
		initialValues.put(KEY_HEIGHT, height);
		initialValues.put(KEY_WEIHGT, weight);
		initialValues.put(KEY_LOSS_WEIGHT, lossWeihgt);
		initialValues.put(KEY_AVG_WEIGHT, avgWeight);
		initialValues.put(KEY_BM, BM);
		initialValues.put(KEY_BMI, BMI);

		return mDB.insert(DATABASE_TABLE, null, initialValues);
	}

	// 지우고싶은 로우값 지우기
	public boolean deleteUserInfo(long rowID) {
		return mDB.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowID, null) > 0;
	}

	// 모든 필드값 받아오기
	public Cursor fetchAllUserInfo() {
		return mDB.rawQuery("SELECTE * FROM "+ DATABASE_TABLE, null);
	}

	// 원하는 로우값 받아오기
	public Cursor fetchUserInfo(long rowID) {
		Cursor cursor = mDB.query(DATABASE_TABLE, new String[] { KEY_ROWID,
				KEY_SEX, KEY_YEAR, KEY_HEIGHT, KEY_WEIHGT, KEY_LOSS_WEIGHT, KEY_AVG_WEIGHT, KEY_BM, KEY_BMI },
				KEY_ROWID + "=" + rowID, null, null, null, null);
		if (cursor != null)
			cursor.moveToFirst();
		return cursor;
	}

	// 필드값 Update
	public boolean updateUserInfo(long rowID, String name, String sex,
			float year, float height, float weight, float lossWeihgt, float avgWeight, float BM, float BMI) {
		ContentValues args = new ContentValues();
		args.put(KEY_NAME, name);
		args.put(KEY_SEX, sex);
		args.put(KEY_YEAR, year);
		args.put(KEY_HEIGHT, height);
		args.put(KEY_WEIHGT, weight);
		args.put(KEY_LOSS_WEIGHT, lossWeihgt);
		args.put(KEY_AVG_WEIGHT, avgWeight);
		args.put(KEY_BM, BM);
		args.put(KEY_BMI, BMI);

		return mDB.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowID, null) > 0;
	}
}

현재 DataBaseAdapter class를 구현하여 db를 사용하고있습니다.

그런데 궁금한게, 처음 table을 만들기 위해 open()메소드를 사용하고, 그리고 insertUserInfo(..)메소드를 통해서 값을 넣어주는데, 마지막에 close()를 통해서 DB를 닫아주는데, 다음에 다른 Activity에서 사용할 때 open()을 또 해주어야되는건가요??

익명사용자 님이 2014년 8월 11일 질문

1개의 답변

0 추천
네 지금 작성한 코드대로라면 해줘야합니다.

단순히 클로즈햇으니까 오픈하냐마냐 문제가 아니라.. 음~

getReadableDatabase 는 읽기권한, 즉 셀렉트할 때 사용해야하구요

getWritableDatabas 는 쓰기권한, 즉 인서트 업데이트 딜릭트 할때 사용해야하는데요

오픈함수에 들어가있는 위의 문법들을 각 항목에 넣어준다면 굳이 오픈을 하지않아도되죠
초보개발자ㅠ (33,870 포인트) 님이 2014년 8월 11일 답변
그런데, Activity에서 사용하려고 open()을 하니, 오류가 떠러립니다..
오류가 떨어진다면 그 오류를 확인해보시면 직빵입니다..
로그캣에서 뭐라고 얘기하나 빨간글씨에 관심을 가져주세요
...