개인공부용123 프로그래밍 블로그
[안드로이드 스튜디오] 데이터베이스 -2- 본문
목 차
1. 헬퍼 클래스를 이용해 업그레이드 지원하기
2. 데이터 조회하기
1. 헬퍼 클래스를 이용해 업그레이드 지원하기
장점은 데이터베이스가 만들어지거나 업그레이드가 필요할 때 콜백 메소드가 호출된다는 점입니다.
[ A P I ]
void onCreate(SQLiteDatabase db)
void onOpen(SQLiteDatabase db)
void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
위 함수들은 헬퍼 클래스 안에서 메소드를 overide시켜야 합니다.
2. 데이터 조회하기
생성한 데이터 베이스의 데이터를 조회하기 위해 표준SQL은 'select ...'구문을 사용하게 되는데 이 구문을 통해 리턴되는 Cursor객체를 받기 위해 rawQuery()메소드를 실행합니다.
즉 execSQL()은 결과값이 없는 SQL실행 방벙이고 , rawQuery()는 결과값을 Cursor객체로 받을 수있는 SQL 실행 방법입니다.
[ A P I ]
Cursor rawQuery(String sql, String[] selectionArgs)
name | age |
Mike | 23 |
Jason | 33 |
Sally | 42 |
이렇게 생긴 데이터베이스 테이블이 있을때
메소드를 통해 전달 받은 Cursor객체는 붉은색 부분을 가리키게됩니다.
moveToNext()메소드 사용시 "Mike" 23 으로 차례대로 내려가게 됩니다.
다음은 헬퍼클래스를 사용해서 데이터베이스와 테이블을 생성하고 데이터를 조회하는 예제입니다.
- 코 드 -
- main.xml -
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<EditText
android:id="@+id/input01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="데이터베이스 이름 입력"
android:text="customer.db"
android:textSize="16dp"
>
</EditText>
<Button
android:id="@+id/queryBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="조회하기"
android:textStyle="bold"
>
</Button>
</LinearLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/status"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff99ccee"
android:textColor="#ff0000ff"
android:textSize="14dp"
>
</TextView>
</ScrollView>
</LinearLayout>
- MainActivity -
package org.androidtown.database.query;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView status;
public static final String TAG = "MainActivity";
private static String DATABASE_NAME = null;
private static String TABLE_NAME = "employee";
private static int DATABASE_VERSION = 1;
private DatabaseHelper dbHelper;
private SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
status = (TextView) findViewById(R.id.status);
final EditText input01 = (EditText) findViewById(R.id.input01);
Button queryBtn = (Button) findViewById(R.id.queryBtn);
queryBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
DATABASE_NAME = input01.getText().toString();
boolean isOpen = openDatabase();
if (isOpen) {
executeRawQuery();
executeRawQueryParam();
}
}
});
}
private boolean openDatabase() {
println("opening database [" + DATABASE_NAME + "].");
dbHelper = new DatabaseHelper(this);
db = dbHelper.getWritableDatabase();// 읽고 쓰기위해 DB를 열음. 권한이없거나 디스크가 가득차면 실패
return true;
}
private void executeRawQuery() {
println("\nexecuteRawQuery called.\n");
Cursor c1 = db.rawQuery("select count(*) as Total from " + TABLE_NAME, null);
println("cursor count : " + c1.getCount());
c1.moveToNext();
println("record count : " + c1.getInt(0));
c1.close();
}
private void executeRawQueryParam() {
println("\nexecuteRawQueryParam called.\n");
String SQL = "select name, age, phone "
+ " from " + TABLE_NAME
+ " where age > ?";
String[] args= {"30"};
Cursor c1 = db.rawQuery(SQL, args);
int recordCount = c1.getCount();
println("cursor count : " + recordCount + "\n");
for (int i = 0; i < recordCount; i++) {
c1.moveToNext();
String name = c1.getString(0);
int age = c1.getInt(1);
String phone = c1.getString(2);
println("Record #" + i + " : " + name + ", " + age + ", " + phone);
}
c1.close();
}
private void println(String msg) {
Log.d(TAG, msg);
status.append("\n" + msg);
}
private class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
//SQLiteOpenHelper(context,DATABASE_NAME,null,DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) { // 데이터베이스 생성
println("creating table [" + TABLE_NAME + "].");
try {
String DROP_SQL = "drop table if exists " + TABLE_NAME;
db.execSQL(DROP_SQL);
} catch(Exception ex) {
Log.e(TAG, "Exception in DROP_SQL", ex);
}
String CREATE_SQL = "create table " + TABLE_NAME + "("
+ " _id integer PRIMARY KEY autoincrement, "
+ " name text, "
+ " age integer, "
+ " phone text)";
try {
db.execSQL(CREATE_SQL);
} catch(Exception ex) {
Log.e(TAG, "Exception in CREATE_SQL", ex);
}
println("inserting records.");
try {
db.execSQL( "insert into " + TABLE_NAME + "(name, age, phone) values ('John', 20, '010-7788-1234');" );
db.execSQL( "insert into " + TABLE_NAME + "(name, age, phone) values ('Mike', 35, '010-8888-1111');" );
db.execSQL( "insert into " + TABLE_NAME + "(name, age, phone) values ('Sean', 26, '010-6677-4321');" );
} catch(Exception ex) {
Log.e(TAG, "Exception in insert SQL", ex);
}
}
public void onOpen(SQLiteDatabase db) { // 데이터베이스오픈시 호출되는 메소드 정의
println("opened database [" + DATABASE_NAME + "].");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 데이터베이스의 버전이 바뀌었을 떄 호출되는 메소드정의
Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ".");
}
}
}
※ Do it 안드로이드 앱 프로그래밍 참조하였습니다.
'Android Studio' 카테고리의 다른 글
[안드로이드 스튜디오] 쓰레드 -2- (0) | 2016.11.08 |
---|---|
[안드로이드 스튜디오] 쓰레드 -1- (1) | 2016.11.07 |
[안드로이드 스튜디오] 메모장만들기 (1) | 2016.11.07 |
[안드로이드 스튜디오] 데이터베이스 -3- (1) | 2016.11.04 |
[안드로이드 스튜디오] 데이터베이스 -1- (0) | 2016.11.03 |