안드로이드는 임베디드 데이터베이스로 개발된 경량급 관계형 데이터베이슨 SQLite를 가지고 있다
SQLite는 파일로 만들어진 하위 수준의 구조를 가지면서도 데이터베이스의 기능까지 그대로 사용할 수 있도록 만든 것이다
그리고 저장될 때는 파일로 저장되므로 데이터베이스의 복사, 이동, 삭제가 매우 쉽다
데이터베이스를 만드는 가장 간단한 방법은 Context 클래스에 정의된 openOrCreateDatabase 메소드를 사용하는 것이다
앱에서 기본적으로 사용하는 액티비티 클래스가 Conext를 상속한 것이므로, 결국 액티비티를 만들 때 그 안에서 openOrCreateDatabase 메소드로 데이터베이스를 만들거나 열 수 있다
Context 클래스에는 이렇게 만든 데이터베이스를 삭제할 수 있는 메소드도 정의되어 있다
SQLite는 각각의 레코드별로 입력되는 데이터의 타입을 다르게 넣을 수 있다
칼럼의 데이터 타입은 참조용으로만 사용되며, 레도크를 입력할 때 어떤 타입의 데이터를 넣어도 오류가 발생하지 않는다
칼럼 타입 | 설명 |
text, varchar | 문자열 |
smallint, integer | 정수 (2바이트 또는 4바이트) |
real, float, double | 부동소수 (4바이트 또는 8바이트) |
boolean | true 또는 false |
date, time, timestamp | 시간 (날짜, 시간, 날짜 + 시간) |
blob, binary | 바이너리 |
activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:inputType="textPersonName" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="데이터베이스 만들기" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/editText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:inputType="textPersonName" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="테이블 만들기" />
</LinearLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp" />
</LinearLayout>
</ScrollView>
</LinearLayout>
MainActivity
package com.example.a60_sample_database;
import androidx.appcompat.app.AppCompatActivity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
EditText editText;
EditText editText2;
TextView textView;
SQLiteDatabase database;
String tableName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = findViewById(R.id.editText);
editText2 = findViewById(R.id.editText2);
textView = findViewById(R.id.textView);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String databaseName = editText.getText().toString();
createDatabase(databaseName);
}
});
Button button2 = findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tableName = editText2.getText().toString();
createTable(tableName);
insertRecord();
}
});
}
private void createDatabase(String databaseName) {
println("createDatabase 호출됨");
// 데이터베이스를 만들기 위한 메소드 실행
// 첫번쩨 파라미터는 데이터베이스의 이름, 이 이름은 데이터베이스 파일의 이름으로도 사용된다
// 두 번째 파라미터는 '사용 모드'이다. 여기에는 MODE_PRIVATE 상수를 넣어준다
// 세 번째 파라미터는 null이 아닌 객체를 지정할 경우, 쿼리의 결과 값으로 반환되는 데이터를 참조하는 커서를 만들어 낼 수 있는 객체가 전달된다
database = openOrCreateDatabase(databaseName, MODE_PRIVATE, null);
println("데이터베이스 생성함 : " + databaseName);
}
private void createTable(String tableName) {
println("createTable 호출됨");
if (database == null) {
println("데이터베이스를 먼저 생성하세요");
return;
}
// execSQL 메소드는 안드로이드 SQLite 객체에서 가장 중요한 메소드이다
// 데이터베이스가 만들어지고 나면, execSQL 메소드는 SQL문을 실행할때 사용한다
// 테이블을 만드는 것뿐만 아니라 레코드 추가처럼 표준 SQL을 사용하는 여러가지 데이터 처리가 가능하다
//
// id의 경우, 안드로이드에서는 앞에 '_'를 붙여 '_id'로 만드는 방법을 권장한다
database.execSQL("create table if not exists " + tableName + " (_id integer PRIMARY KEY autoincrement, name text, age integer, mobile text)");
println("테이블 생성함 : " + tableName);
}
private void insertRecord() {
println("insertRecord 호출됨");
if (database == null) {
println("데이터베이스를 먼저 생성하세요");
return;
}
if (tableName == null) {
println("테이블을 먼저 생성하세요");
}
database.execSQL("insert into " + tableName + " (name, age, mobile) values ('John', 20, '010-1000-1000')");
println("레코드 추가함");
}
private void println(String data) {
textView.append(data + "\n");
}
}
DB를 확인하려면 Device File Explorer 화면을 띄워야한다
/data/data/[패키지 이름]/databases/ 안에 있다
이 경로는 openOrCreateDatabase 메소드를 호출해서 만든 데이터베이스가 저장되는 곳이다
GUI 관리 도구를 사용하여 만든 데이터베이스 파일을 이 위치에 복사해 넣으면 코드에서 만든 데이터베이스처럼 사용할 수 있다
다만 데이터베이스 파일이 /data 폴더 안에 생성되면 보안 때문에 실제 단말에서는 이 폴더를 볼 수 없다
이렇게 데이터베이스 파일이 생성되는 위치에 따라 제약이 있을 수 있기 때문에 SD 카드에 저장하는 방법도 있다
SQLite는 GUI 기반의 관리도구로 DB Browser for SQLite가 있다
https://sqlitebrowser.org/
'안드로이드' 카테고리의 다른 글
스키마 변경 - SQLiteOpenHelper 클래스 (0) | 2021.10.29 |
---|---|
Database Inspector (0) | 2021.10.29 |
영화 정보 가져와 보여주기 (0) | 2021.10.28 |
JSON 데이터 다루기 (0) | 2021.10.28 |
Volley - HTTP 라이브러리 (0) | 2021.10.28 |