개인공부용123 프로그래밍 블로그

[안드로이드 스튜디오] 데이터베이스 -2- 본문

Android Studio

[안드로이드 스튜디오] 데이터베이스 -2-

개인공부용123 2016. 11. 3. 23:41

목 차


1. 헬퍼 클래스를 이용해 업그레이드 지원하기


2. 데이터 조회하기


1. 헬퍼 클래스를 이용해 업그레이드 지원하기


API에서 제공하는 헬퍼(Helper)클래스를 사용해 데이터베이스를 만들거나 스키마를 업그레이드 할수있습니다.

SQLiteOpenHelper 클래스는 데이터베이스를 만들거나 열기위해 필요한 일들을 도와줍니다.
SQLiteOpenHelper객체는 new 연산자를 이용해 만들게 됩니다.

[ A P I ]
public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

-인자-
첫번째 인자: Context 객체이므로 액티비티 안에서 만들 경우 this로 지정할 수 있습니다.

두번째 인자: 데이터베이스의 이름

세번째 인자: 커서를 만들어낼 CursorFactory객체

네번째 인자: 정수 타입의 버전 정보는 데이터베이스 업그레이드를 위해 사용하며 기존에 만들어져 있는 데이터베이스의 버전 정보와 다르게 지정하여 데이터베이스의 스키마나 데이터를 바꿀수있습니다.

물론 SQLiteOpenHelper객체를 만들었다해도 데이터베이스 파일이 바로 만들어지는 것은아니고 getReadableDatabase() 또는 getWritableDatabase() 메소드를 호출 해야합니다.


장점은 데이터베이스가 만들어지거나 업그레이드가 필요할 때 콜백 메소드가 호출된다는 점입니다.


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


-인자-

첫번째 인자: 완벽한 SQL 구문

두번째 인자: 첫번째 인자로 들어온 SQL구문에 ?로 표시된 곳의 값

이 메소드를 통해 전달받은 Cursor객체는 처음에는 아무런 레코드를 가르키지 않으며 moveToNext()메소드를 이용해 다음 레코드를 가리키도록 해야 레코드 값을 가져올 수 있습니다.

예를 들면

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 안드로이드 앱 프로그래밍 참조하였습니다.