Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

안드로이드 SQLite에 데이터 삽입 후 ListView를 갱신하는 방법

안드로이드 SQLite 데이터베이스란?

예제를 시작하기 전에 안드로이드의 SQLite 데이터베이스에 대해 간단히 알아보겠습니다. SQLite는 기기 내부의 텍스트 파일 형태로 데이터를 저장하는 오픈소스 SQL 데이터베이스입니다. 안드로이드에는 SQLite 데이터베이스 구현이 기본적으로 내장되어 있어, JDBC나 ODBC처럼 별도의 연결 설정 없이 바로 사용할 수 있습니다. 또한 SQLite는 관계형 데이터베이스의 거의 모든 기능을 지원하기 때문에 모바일 환경에서 로컬 데이터를 관리하기에 매우 적합합니다.

이번 예제에서는 SQLite에 값을 삽입한 후 ListView를 즉시 갱신하는 방법을 단계별로 살펴보겠습니다.

구현 단계

1단계 — 새 프로젝트 생성

안드로이드 스튜디오에서 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" />
    <ListView
        android:id = "@+id/listView"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content">
    </ListView>
</LinearLayout>

위 레이아웃은 이름(name)과 급여(salary)를 입력받는 두 개의 EditText, 그리고 저장(Save)·새로고침(Refresh) 버튼과 ListView로 구성되어 있습니다. 사용자가 저장 버튼을 누르면 입력한 데이터가 SQLite 데이터베이스에 저장되고, 새로고침 버튼을 누르면 커서(Cursor)에서 최신 데이터를 읽어와 ListView를 갱신합니다.

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 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");
                }
            }
        });
    }
}

핵심 포인트는 새로고침 버튼의 클릭 리스너에 있습니다. 먼저 array_list.clear()로 기존 데이터를 비운 뒤, helper.getAllContacts()로 데이터베이스에서 최신 데이터를 다시 가져오고, 마지막으로 notifyDataSetChanged()를 호출하여 어댑터에 변경 사항을 알립니다. 이렇게 하면 ListView가 화면에 즉시 반영됩니다.

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 = "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 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;
    }
}

DatabaseHelper 클래스는 SQLiteOpenHelper를 상속받아 데이터베이스 생성(onCreate), 업그레이드(onUpgrade), 데이터 삽입(insert), 그리고 전체 데이터 조회(getAllContacts) 기능을 담당합니다. getAllContacts 메서드는 rawQuery로 커서를 얻은 후, 커서를 처음부터 끝까지 순회하며 name 컬럼의 값을 ArrayList에 담아 반환합니다.

앱 실행 및 결과 확인

이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기가 컴퓨터에 연결되어 있다고 가정합니다. 안드로이드 스튜디오에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run 아이콘을 클릭하세요. 실행할 모바일 기기를 선택하면 해당 기기에 앱의 기본 화면이 표시됩니다.

안드로이드 SQLite에 데이터 삽입 후 ListView를 갱신하는 방법

EditText에 이름과 급여를 입력한 후 아래와 같이 저장(Save) 버튼을 클릭합니다.

안드로이드 SQLite에 데이터 삽입 후 ListView를 갱신하는 방법

값이 정상적으로 삽입되었다면, 새로고침(Refresh) 버튼을 클릭하여 아래와 같이 ListView가 최신 데이터로 갱신되는 것을 확인할 수 있습니다.

안드로이드 SQLite에 데이터 삽입 후 ListView를 갱신하는 방법

마무리

이 예제의 핵심은 데이터 삽입 후 어댑터의 notifyDataSetChanged()를 호출해 UI를 갱신하는 것입니다. 참고로 최신 안드로이드 개발에서는 ListView 대신 RecyclerView를 사용하는 것이 권장되며, LiveData나 Flow 같은 관찰 가능한 데이터 홀더를 활용하면 데이터 변경 시 UI를 자동으로 갱신할 수 있어 더욱 효율적인 구조를 만들 수 있습니다.