본격적인 예제에 앞서, 안드로이드의 SQLite 데이터베이스가 무엇인지 간단히 짚고 넘어가겠습니다. SQLite는 데이터를 기기 내부의 텍스트 파일 형태로 저장하는 오픈소스 SQL 데이터베이스입니다. 안드로이드에는 SQLite 구현이 기본으로 내장되어 있어 별도의 설정 없이 바로 사용할 수 있으며, 관계형 데이터베이스가 제공하는 대부분의 기능을 지원합니다. 또한 JDBC나 ODBC처럼 별도의 연결(Connection)을 맺을 필요 없이 곧바로 데이터베이스에 접근할 수 있다는 점이 큰 장점입니다.
이 글에서는 안드로이드 SQLite에서 SELECT 쿼리를 사용해 저장된 데이터를 조회하는 방법을 단계별 예제와 함께 살펴보겠습니다.
1단계: 새 프로젝트 생성
Android Studio에서 File → New Project를 선택하고, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.
2단계: 레이아웃 작성 (activity_main.xml)
res/layout/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 버튼, 목록을 갱신하는 Refresh 버튼, 그리고 결과를 표시할 ListView로 구성되어 있습니다. 사용자가 Save 버튼을 누르면 입력값이 SQLite 데이터베이스에 저장되고, Refresh 버튼을 누르면 ListView가 최신 데이터로 갱신됩니다.
3단계: MainActivity 작성
src/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 savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final DatabaseHelper helper = new DatabaseHelper(this);
final ArrayList array_list = helper.getAllContacts();
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.getAllContacts());
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");
}
}
});
}
}
MainActivity에서는 DatabaseHelper 인스턴스를 생성해 초기 데이터를 불러온 뒤, ArrayAdapter를 통해 ListView에 연결합니다. Save 버튼 클릭 시 이름과 급여가 모두 입력되었는지 검사하고 insert() 메서드로 데이터를 저장하며, Refresh 버튼 클릭 시 getAllContacts() 메서드를 호출해 목록을 다시 읽어옵니다.
4단계: DatabaseHelper 작성
src/DatabaseHelper.java에 아래 코드를 추가합니다.
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) {
e.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 getAllContacts() {
SQLiteDatabase db = this.getReadableDatabase();
ArrayList<String> array_list = new ArrayList<String>();
Cursor res = db.rawQuery("select * from " + CONTACTS_TABLE_NAME, null);
res.moveToFirst();
while (!res.isAfterLast()) {
array_list.add(res.getString(res.getColumnIndex("name")));
res.moveToNext();
}
return array_list;
}
}
SELECT 조회의 핵심은 getAllContacts() 메서드입니다. getReadableDatabase()로 읽기 전용 데이터베이스를 열고, rawQuery()에 select * from SalaryDetails 쿼리를 전달하면 Cursor 객체가 반환됩니다. 이 Cursor를 moveToFirst()부터 moveToNext()로 순회하며 각 행(row)의 name 컬럼 값을 ArrayList에 담으면, 테이블의 전체 데이터를 조회할 수 있습니다.
조건이 있는 SELECT 쿼리
특정 조건에 맞는 데이터만 조회하고 싶다면 WHERE 절과 파라미터 바인딩을 활용하면 됩니다.
Cursor res = db.rawQuery(
"select * from " + CONTACTS_TABLE_NAME + " where name = ?",
new String[]{s}
);
이처럼 ? 플레이스홀더에 값을 바인딩하면 SQL 인젝션 위험도 함께 줄일 수 있으므로, 문자열을 직접 연결하는 방식보다 권장됩니다.
앱 실행 및 결과 확인
실제 안드로이드 기기를 컴퓨터에 연결한 상태라고 가정하고 앱을 실행해 보겠습니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 열고 툴바의 Run 아이콘을 클릭한 뒤, 실행할 모바일 기기를 선택합니다. 그러면 기기에 아래와 같은 기본 화면이 표시됩니다.

EditText에 이름과 급여를 입력한 뒤 Save 버튼을 눌러 데이터를 저장합니다.

마지막으로 Refresh 버튼을 누르면 ListView가 갱신되면서 방금 저장한 데이터가 목록에 표시되는 것을 확인할 수 있습니다. 이 과정을 통해 INSERT로 저장한 데이터를 SELECT 쿼리로 다시 조회해 화면에 출력하는 전체 흐름을 이해할 수 있습니다.
