안드로이드 SQLite란 무엇인가?
예제를 살펴보기 전에, 먼저 안드로이드에서의 SQLite 데이터베이스에 대해 알아보겠습니다. SQLite는 오픈 소스 SQL 데이터베이스로, 기기의 텍스트 파일 형태로 데이터를 저장합니다. 안드로이드에는 SQLite 데이터베이스 구현이 기본적으로 내장되어 있으며, 관계형 데이터베이스의 모든 기능을 지원합니다. 또한 JDBC나 ODBC처럼 별도의 데이터베이스 연결을 설정할 필요 없이 바로 접근하여 사용할 수 있다는 것이 큰 장점입니다.
이 글에서는 안드로이드 SQLite에서 OR 결합 연산자(Conjunctive Operator)를 사용하여 조건에 맞는 데이터를 조회하는 방법을 단계별로 알아보겠습니다.
1단계: 새 프로젝트 생성하기
Android Studio를 열고 File → New Project 메뉴로 이동한 후, 필요한 모든 세부 정보를 입력하여 새 프로젝트를 생성합니다.
2단계: 레이아웃 파일 작성하기
다음 코드를 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 버튼을 클릭하면 입력한 데이터가 SQLite 데이터베이스에 저장됩니다. 이후 Refresh 버튼을 클릭하면 OR 연산자를 활용한 쿼리 결과로 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 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");
}
}
});
}
}
MainActivity에서는 Save 버튼 클릭 시 입력값의 유효성을 검사한 후 데이터베이스에 저장하고, Refresh 버튼 클릭 시 데이터베이스에서 조회한 결과로 리스트를 갱신하도록 구현했습니다.
4단계: DatabaseHelper 작성하기
다음 코드를 src/DatabaseHelper.java 파일에 추가합니다. 여기서 핵심은 OR 연산자를 사용한 쿼리입니다.
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 salary >'10' OR name LIKE 'Sa%' ", null );
res.moveToFirst();
while(res.isAfterLast() == false) {
array_list.add(res.getString(res.getColumnIndex("name")));
res.moveToNext();
}
return array_list;
}
}
위 코드에서 가장 중요한 부분은 getAllCotacts() 메서드입니다. 다음 쿼리를 통해 OR 연산자를 사용하고 있습니다.
select * from SalaryDetails WHERE salary >'10' OR name LIKE 'Sa%'
이 쿼리는 급여(salary)가 10보다 크거나, 이름(name)이 'Sa'로 시작하는 모든 레코드를 조회합니다. 즉, 두 조건 중 하나라도 만족하는 데이터가 모두 반환됩니다. 이것이 바로 OR 연산자의 동작 방식입니다.
애플리케이션 실행하기
이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기가 컴퓨터와 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바에서 Run 아이콘을 클릭하세요. 실행할 기기로 자신의 모바일 기기를 선택하면, 모바일 화면에 아래와 같은 기본 화면이 표시됩니다.

위 실행 결과를 보면, 급여가 10보다 크거나 이름이 'Sa'로 시작하는 조건을 만족하는 이름들이 ListView에 표시되는 것을 확인할 수 있습니다. 이처럼 SQLite의 OR 연산자를 활용하면 여러 조건 중 하나라도 충족하는 데이터를 손쉽게 조회할 수 있습니다.