본문 바로가기

ANDROID의 속삭임

[android][SQLite]래퍼 메소드를 활용한 쿼리

* SchemaHelper.java

package com.example.sqlex2;


import java.util.HashSet;

import java.util.Set;


import android.content.ContentValues;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.util.Log;


import com.example.sqlex2.table.ClassTable;

import com.example.sqlex2.table.CourseTable;

import com.example.sqlex2.table.StudentTable;


public class SchemaHelper extends SQLiteOpenHelper {


private static final String DATABASE_NAME = "adv_data.db";

// 테이블과 데이터 베이스를 갱신하기 위해 이 숫자를 토글 (toggle) 한다.

private static final int DATABASE_VERSION = 3;


public SchemaHelper(Context context) {

super(context, DATABASE_NAME, null, DATABASE_VERSION);

// TODO Auto-generated constructor stub

}


@Override

public void onCreate(SQLiteDatabase db) {

// TODO Auto-generated method stub

// S

// Student 테이블을 생성한다.

db.execSQL("CREATE TABLE " + StudentTable.TABLE_NAME + " (" + 

StudentTable.ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +

StudentTable.NAME + " TEXT," + StudentTable.STATE + " TEXT," +

StudentTable.GRADE + " INTEGER);");

Log.d(this.getClass().getName(), "Create Table " + StudentTable.TABLE_NAME);

// Courses 테이블을 생성한다.

db.execSQL("CREATE TABLE " + CourseTable.TABLE_NAME + "  (" + 

CourseTable.ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +

CourseTable.NAME +" TEXT);");

Log.d(this.getClass().getName(), "Create Table " + CourseTable.TABLE_NAME);

// 맵핑 테이블 클래스를 생성한다.

db.execSQL("CREATE TABLE " + ClassTable.TABLE_NAME + " (" + 

ClassTable.ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 

ClassTable.STUDENT_ID + " INTEGER, " + ClassTable.COURSE_ID +

" INTEGER);");

Log.d(this.getClass().getName(), "Create Table " + ClassTable.TABLE_NAME);

}


@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

// TODO Auto-generated method stub

Log.w(this.getClass().getName(), "Upgrading Database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data");

// 업그레이드 됐다면 이전 테이블을 제거한다.

db.execSQL("DROP TABLE IF EXISTS " + StudentTable.TABLE_NAME);

db.execSQL("DROP TABLE IF EXISTS " + CourseTable.TABLE_NAME);

db.execSQL("DROP TABLE IF EXISTS " + ClassTable.TABLE_NAME);

// 새로운 스팀 인스턴스를 생성한다

onCreate(db);

}

// 학생 추가를 위한 래퍼 메소드

public long addStudent (String name, String state, int grade){

// CONTENTVALUE 객체 생성

ContentValues cv = new ContentValues();

cv.put(StudentTable.NAME, name);

cv.put(StudentTable.STATE, state);

cv.put(StudentTable.GRADE, grade);

// 쓰기 가능한 데이터 베이스를 가져와 입력한다.

SQLiteDatabase sd = getWritableDatabase();

long result = sd.insert(StudentTable.TABLE_NAME, StudentTable.NAME, cv);

return result;

}

// 과정 추가를 위한 래퍼 메소드

public long addCourse(String name){

ContentValues cv = new ContentValues();

cv.put(CourseTable.NAME, name);

SQLiteDatabase sd = getWritableDatabase();

long result = sd.insert(CourseTable.TABLE_NAME, CourseTable.NAME, cv);

return result;

}

//학생을 과정에 등록하기 위한 래퍼 메소드

public boolean enrollStudentClass(int studentId, int courseId){

ContentValues cv = new ContentValues();

cv.put(ClassTable.STUDENT_ID, studentId);

cv.put(ClassTable.COURSE_ID, courseId);

SQLiteDatabase sd = getWritableDatabase();

long result = sd.insert(ClassTable.TABLE_NAME, ClassTable.STUDENT_ID, cv);

return (result >= 0);

}

/**

* 주어진 과정 내의 학생 목록을 수집할 수 있다.

* @param courseId

* @return

*/

public Cursor getStudentsForCourse( int courseId){

SQLiteDatabase sd = getWritableDatabase();

// 학생 ID만 반환한다.

String[] columns = new String[] { ClassTable.STUDENT_ID };

String[] selectionArgs = new String[] { String.valueOf(courseId)};

// 과정 내의 학생에 대한 클래스 매핑을 쿼리 한다.

// 테이블명, 반환받고자 하는 컬럼명, 조건절, 조건절 값, 그룹절, 해빙절, 정렬절.

Cursor c = sd.query(ClassTable.TABLE_NAME, columns, ClassTable.COURSE_ID + "= ? ", selectionArgs, null,null,null);

return c;

}

/**

* 주어진 학생이 속한 과정을 가져온다.

* @param courseId

* @return

*/

public Cursor getCoursesForStudent( int studentId){

SQLiteDatabase sd = getWritableDatabase();

// 학생 ID만 반환한다.

String[] columns = new String[] { ClassTable.COURSE_ID };

String[] selectionArgs = new String[] { String.valueOf(studentId)};

// 과정 내의 학생에 대한 클래스 매핑을 쿼리 한다.

// 테이블명, 반환받고자 하는 컬럼명, 조건절, 조건절 값, 그룹절, 해빙절, 정렬절.

Cursor c = sd.query(ClassTable.TABLE_NAME, columns, ClassTable.STUDENT_ID + "= ? ", selectionArgs, null,null,null);

return c;

}

/**

* 주어진 과정에 학생목록을 수집 한후, 주어진 특정 등급의 학생을 수집한다. 그후 마지막으로  두 모집 학생을 교집합 한다.

* @param courseId

* @param grade

* @return

*/

public Set<Integer> getStudentsByGradeForCourse( int courseId, int grade){

SQLiteDatabase sd = getWritableDatabase();

// 과정 ID만 반환한다.

String [] columns = new String[] {ClassTable.STUDENT_ID};

String [] selectionArgs = new String[] { String.valueOf(courseId)};

// 과정 내의 학생에 대한 클래스 매핑을 쿼리한다.

Cursor c = sd.query(ClassTable.TABLE_NAME, columns, ClassTable.COURSE_ID + "= ? ", selectionArgs, null, null, null);

Set<Integer> returnIds = new HashSet<Integer>();

while (c.moveToNext()){

int id = c.getInt(c.getColumnIndex(ClassTable.STUDENT_ID));

returnIds.add(id);

}

// 두 번째 쿼리를 만든다.

columns = new String[] { StudentTable.ID };

selectionArgs = new String[] { String.valueOf(grade) };

c = sd.query(StudentTable.TABLE_NAME, columns, StudentTable.GRADE + "= ?", selectionArgs, null,null,null);

Set<Integer> gradeIds = new HashSet<Integer>();

while ( c.moveToNext() ){

int id = c.getInt(c.getColumnIndex(StudentTable.ID));

gradeIds.add(id);

}

// ID Set의 교집합을 반환한다.

returnIds.retainAll(gradeIds);

return returnIds;

}

// 학생을 안전하게 제거하는 메소드

public boolean removeStudent(int studentId){

SQLiteDatabase sd = getWritableDatabase();

String[] whereArgs = new String[]{ String.valueOf(studentId)};

// 학생이 등록된 모든 클래스 매핑을 제거한다.

sd.delete(ClassTable.TABLE_NAME, ClassTable.STUDENT_ID + " =  ? ", whereArgs);

// 그후 학생을 삭제한다.

int result = sd.delete(StudentTable.TABLE_NAME, StudentTable.ID + "= ? ", whereArgs);

return ( result > 0 );

}

// 과정을 안전하게 제거하는 메소드

public boolean removeCourse(int courseId){

SQLiteDatabase sd = getWritableDatabase();

String[] whereArgs = new String[]{ String.valueOf(courseId) };

// 등록된 모든 학생으로부터 과정을 제거해야 한다.

sd.delete(ClassTable.TABLE_NAME, ClassTable.COURSE_ID + " = ?", whereArgs);

// 그 후 과정을 삭제한다.

int result = sd.delete(CourseTable.TABLE_NAME, CourseTable.ID + "= ? ", whereArgs);

return (result > 0);

}

}