본문 바로가기

ANDROID의 속삭임

[android][SQLite]다양한 Select 방법.

* DB Table을 정의한 클래스가 필요하지만, 중요한것이 아니기에 생략.



* MainActivity.java

package com.example.sqlex3;


import android.app.Activity;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteQueryBuilder;

import android.os.Bundle;

import android.view.Menu;


import com.example.sqlex3.table.StudentTable;


public class MainActivity extends Activity {


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

SchemaHelper sch = new SchemaHelper(this);

// 학생을 추가하고 그 ID를 반환한다.

long sid1 = sch.addStudent("Jason Wei", "IL", 12);

long sid2 = sch.addStudent("Du Chung", "AR", 12);

long sid3 = sch.addStudent("George Tang", "CA", 11);

long sid4 = sch.addStudent("Mark Bocanegra", "CA", 11);

long sid5 = sch.addStudent("Bobby Wei", "IL", 12);

SQLiteDatabase sqdb = sch.getWritableDatabase();

/*

* Select 쿼리  

*/

// 방법 #1 = SQLITEDATABASE RAWQUERY()

Cursor c = sqdb.rawQuery("SELECT * FROM " + StudentTable.TABLE_NAME, null);

while(c.moveToNext()){

int colid = c.getColumnIndex(StudentTable.NAME);

String name = c.getString(colid);

System.out.println("GOT STUENT " + name);

}

// 방법 #2 = SQLITEDATABASE QUERY()

c = sqdb.query(StudentTable.TABLE_NAME, null,null,null,null,null,null);

while(c.moveToNext()){

int colid = c.getColumnIndex(StudentTable.NAME);

String name = c.getString(colid);

System.out.println("GOT STUDENT " + name);

}

// 방법 #3 - SQLITEQUERYBUILDER 

/*

* 쿼리를 수행해 그 값을 반환하는것이 아니라 수행한 쿼리를 반환하여 다른 작업을 할수 있게 연장한다.

*/

String query = SQLiteQueryBuilder.buildQueryString(false, StudentTable.TABLE_NAME, null, null, null, null,null, null);

System.out.println(query);

c = sqdb.rawQuery(query, null);

while(c.moveToNext()){

int colid = c.getColumnIndex(StudentTable.NAME);

String name = c.getString(colid);

System.out.println("GOT STUDENT " + name);

}

}


@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}


}



* SchemaHelper.java

package com.example.sqlex3;


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.sqlex3.table.ClassTable;

import com.example.sqlex3.table.CourseTable;

import com.example.sqlex3.table.StudentTable;


public class SchemaHelper extends SQLiteOpenHelper {


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

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

private static final int DATABASE_VERSION = 5;


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);

}

}