* 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);
}
}
'ANDROID의 속삭임' 카테고리의 다른 글
[android][라이브러리] 안드로이드 차트 라이브러리 (0) | 2013.09.25 |
---|---|
[android][SQLite]ContentProvider (0) | 2013.09.24 |
[android][SQLite]래퍼 메소드를 활용한 쿼리 (0) | 2013.09.17 |
[android][SQLite] Table 생성, Insert, Select의 기본 예제문. (0) | 2013.09.13 |
[android][기초][외부 저장 장치]외부 저장장치에 쓰기 (0) | 2013.09.13 |