안드로이드의 SQLite 데이터베이스란?
예제를 살펴보기 전에, 안드로이드에서 SQLite 데이터베이스가 무엇인지 먼저 이해할 필요가 있습니다. SQLite는 기기 내 텍스트 파일 형태로 데이터를 저장하는 오픈 소스 SQL 데이터베이스입니다. 안드로이드에는 SQLite 데이터베이스 구현이 기본으로 내장되어 있으며, SQLite는 관계형 데이터베이스의 모든 기능을 지원합니다.
또한 JDBC나 ODBC처럼 별도의 연결(connection)을 설정할 필요 없이 바로 데이터베이스에 접근할 수 있다는 점이 큰 장점입니다.
이 글에서는 안드로이드 SQLite에서 WHERE 절과 LIKE 연산자를 사용해 데이터를 필터링하는 방법을 단계별로 알아보겠습니다.
1단계: 새 프로젝트 생성
Android Studio에서 File → New Project를 선택하고, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.
2단계: 레이아웃 파일 작성 (res/layout/activity_main.xml)
아래 코드를 activity_main.xml에 추가합니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:hint="Enter Name"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/salary"
android:layout_width="match_parent"
android:inputType="numberDecimal"
android:hint="Enter Salary"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/save"
android:text="Save"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/refresh"
android:text="Refresh"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>위 코드에서는 이름(name)과 급여(salary)를 입력받는 EditText 두 개를 배치했습니다. 사용자가 Save 버튼을 클릭하면 입력한 데이터가 SQLite 데이터베이스에 저장됩니다. 그리고 값을 입력한 후 Refresh 버튼을 클릭하면 LIKE 연산자를 적용한 커서(cursor) 결과로 ListView가 갱신됩니다.
3단계: MainActivity 작성 (src/MainActivity.java)
아래 코드를 MainActivity.java에 추가합니다.
package com.example.andy.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
Button save, refresh;
EditText name, salary;
private ListView listView;
@Override
protected void onCreate(Bundle readdInstanceState) {
super.onCreate(readdInstanceState);
setContentView(R.layout.activity_main);
final DatabaseHelper helper = new DatabaseHelper(this);
final ArrayList array_list = helper.getAllCotacts();
name = findViewById(R.id.name);
salary = findViewById(R.id.salary);
listView = findViewById(R.id.listView);
final ArrayAdapter arrayAdapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, array_list);
listView.setAdapter(arrayAdapter);
findViewById(R.id.refresh).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
array_list.clear();
array_list.addAll(helper.getAllCotacts());
arrayAdapter.notifyDataSetChanged();
listView.invalidateViews();
listView.refreshDrawableState();
}
});
findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!name.getText().toString().isEmpty() && !salary.getText().toString().isEmpty()) {
if (helper.insert(name.getText().toString(), salary.getText().toString())) {
Toast.makeText(MainActivity.this, "Inserted", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "NOT Inserted", Toast.LENGTH_LONG).show();
}
} else {
name.setError("Enter NAME");
salary.setError("Enter Salary");
}
}
});
}
}4단계: DatabaseHelper 작성 (src/DatabaseHelper.java)
아래 코드를 DatabaseHelper.java에 추가합니다. 여기서 핵심은 WHERE 절과 LIKE 연산자를 활용한 쿼리 부분입니다.
package com.example.andy.myapplication;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import java.io.IOException;
import java.util.ArrayList;
class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "salaryDatabase3";
public static final String CONTACTS_TABLE_NAME = "SalaryDetails";
public DatabaseHelper(Context context) {
super(context,DATABASE_NAME,null,1);
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(
"create table "+ CONTACTS_TABLE_NAME +"(id INTEGER PRIMARY KEY, name text,salary text )"
);
} catch (SQLiteException e) {
try {
throw new IOException(e);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS "+CONTACTS_TABLE_NAME);
onCreate(db);
}
public boolean insert(String s, String s1) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("name", s);
contentValues.put("salary", s1);
db.insert(CONTACTS_TABLE_NAME, null, contentValues);
return true;
}
public ArrayList getAllCotacts() {
SQLiteDatabase db = this.getReadableDatabase();
ArrayList<String> array_list = new ArrayList<String>();
Cursor res = db.rawQuery( "select * from "+CONTACTS_TABLE_NAME+" WHERE name LIKE 'Sa%'", null );
res.moveToFirst();
while(res.isAfterLast() == false) {
array_list.add(res.getString(res.getColumnIndex("name")));
res.moveToNext();
}
return array_list;
}
}LIKE 연산자의 동작 원리
위 코드의 핵심 쿼리는 다음과 같습니다.
select * from SalaryDetails WHERE name LIKE 'Sa%'
SQL에서 %는 와일드카드 문자로, 0개 이상의 임의 문자열을 의미합니다. 따라서 'Sa%' 조건은 'Sa'로 시작하는 모든 이름과 일치하게 됩니다. 예를 들어 'Sam', 'Sara', 'Samuel' 등이 모두 조회 대상에 포함됩니다.
만약 이름 중간에 특정 문자가 포함된 데이터를 찾고 싶다면 '%am%', 끝나는 문자열을 찾고 싶다면 '%ry'와 같이 와일드카드 위치를 조정하면 됩니다.
애플리케이션 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 모바일 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run 아이콘을 클릭하세요. 실행 옵션에서 자신의 모바일 기기를 선택하면, 기기 화면에 다음과 같은 기본 화면이 표시됩니다.

실행 결과 ListView에는 'Sa'로 시작하는 이름만 표시됩니다. 이는 쿼리에 WHERE 절과 LIKE 'sa%' 조건을 적용했기 때문입니다. 이처럼 WHERE 절과 LIKE 연산자를 조합하면 안드로이드 SQLite에서 손쉽게 원하는 조건의 데이터만 필터링해서 조회할 수 있습니다.