안드로이드 SQLite란 무엇인가?
본격적인 예제에 들어가기 전에, 안드로이드에서 SQLite 데이터베이스가 어떤 역할을 하는지 먼저 살펴보겠습니다. SQLite는 오픈 소스 SQL 데이터베이스로, 기기 내부의 텍스트 파일 형태로 데이터를 저장합니다. 안드로이드에는 SQLite 데이터베이스 구현이 기본적으로 내장되어 있어 별도의 설치 없이 바로 사용할 수 있으며, 관계형 데이터베이스의 핵심 기능들을 모두 지원합니다.
또한 SQLite는 JDBC나 ODBC처럼 별도의 연결(Connection) 설정 과정이 필요 없다는 큰 장점이 있습니다. 이번 글에서는 안드로이드 SQLite에서 LONGTEXT 값을 활용하는 방법을 단계별 예제와 함께 자세히 알아보겠습니다.
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" /> <Button android:id = "@+id/udate" android:text = "Update" android:layout_width = "wrap_content" android:layout_height = "wrap_content" /> <Button android:id = "@+id/Delete" android:text = "DeleteALL" 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 두 개와 네 개의 버튼, 그리고 데이터를 표시할 ListView로 구성되어 있습니다. 사용자가 Save(저장) 버튼을 클릭하면 입력된 데이터가 SQLite 데이터베이스에 저장됩니다. 값을 삽입한 후 Refresh(새로고침) 버튼을 누르면 커서(cursor)를 기반으로 ListView가 갱신되고, Update(수정) 버튼을 클릭하면 기존 데이터가 업데이트됩니다.
3단계: MainActivity.java 작성
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.Delete).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (helper.delete()) {
Toast.makeText(MainActivity.this, "Deleted", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "NOT Deleted", Toast.LENGTH_LONG).show();
}
}
});
findViewById(R.id.udate).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!name.getText().toString().isEmpty() && !salary.getText().toString().isEmpty()) {
if (helper.update(name.getText().toString(), salary.getText().toString())) {
Toast.makeText(MainActivity.this, "Updated", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "NOT Updated", Toast.LENGTH_LONG).show();
}
} else {
name.setError("Enter NAME");
salary.setError("Enter Salary");
}
}
});
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");
}
}
});
}
}메인 액티비티에서는 각 버튼에 클릭 리스너를 등록하여 저장, 조회, 수정, 삭제 기능을 처리합니다. 입력값이 비어 있는 경우에는 setError()를 통해 사용자에게 유효성 검사 오류를 표시하도록 구현했습니다.
4단계: DatabaseHelper.java 작성
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 = "salaryDatabase5";
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 LONGTEXT ,salary BIGINT(8),datetime default current_timestamp )"
);
} 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.replace(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 = 'sairam' AND name is not null ", null );
Cursor res = db.rawQuery( "select (id ||' : '||name || ' : ' || salary || ' : '|| datetime) AS fullname from "+CONTACTS_TABLE_NAME, null );
res.moveToFirst();
while(res.isAfterLast() = = false) {
array_list.add(res.getString(res.getColumnIndex("fullname")));
res.moveToNext();
}
return array_list;
}
public boolean update(String s, String s1) {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("UPDATE "+CONTACTS_TABLE_NAME+" SET name = "+"'"+s+"', "+ "salary = "+"'"+s1+"'");
return true;
}
public boolean delete() {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DELETE from "+CONTACTS_TABLE_NAME);
return true;
}
}이 클래스의 핵심은 onCreate() 메서드의 테이블 생성 쿼리입니다. name 컬럼을 LONGTEXT 타입으로 선언하여 일반 TEXT보다 훨씬 긴 문자열 데이터를 저장할 수 있도록 했습니다. SQLiteOpenHelper를 상속받아 데이터베이스 생성과 버전 업그레이드(onUpgrade)를 자동으로 관리하며, insert(), getAllCotacts(), update(), delete() 메서드를 통해 기본적인 CRUD 기능을 제공합니다.
앱 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 모바일 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 Run 아이콘을 클릭하고, 목록에서 자신의 모바일 기기를 선택하면 기기 화면에 아래와 같은 기본 화면이 표시됩니다.

위 예제에서는 name 컬럼에 LONGTEXT 값을 저장했습니다. 이제 Refresh(새로고침) 버튼을 클릭해 ListView를 갱신하면 다음과 같은 출력 결과를 확인할 수 있습니다.
