Android/Framework

Android Framework의 SQLite 라이브러리 분석

임베디드 친구 2025. 4. 1. 09:53
728x90
반응형

Android Framework의 SQLite 라이브러리 분석

1. 서론

SQLite는 Android의 주요 데이터 저장소로 사용되는 관계형 데이터베이스 관리 시스템(RDBMS)입니다. Android Framework 내에서 SQLite는 android.database.sqlite 패키지를 통해 제공되며, 다양한 API를 통해 데이터베이스 조작이 가능합니다. 본 포스팅에서는 SQLite 라이브러리의 구조와 주요 클래스, 그리고 AOSP(Android Open Source Project) 코드 분석을 통해 Android에서 SQLite가 어떻게 동작하는지 살펴보겠습니다.

2. SQLite 개요

SQLite는 가볍고, 독립적이며, 트랜잭션을 지원하는 관계형 데이터베이스 시스템입니다. 파일 기반 데이터베이스로 작동하며, 서버가 필요하지 않다는 점이 특징입니다. Android에서는 SQLiteOpenHelper와 같은 클래스를 제공하여 데이터베이스의 생성과 관리를 쉽게 할 수 있도록 하고 있습니다.

2.1. SQLite의 특징

  • 파일 기반 데이터베이스: 단일 파일로 데이터베이스가 저장됩니다.
  • ACID(Atomicity, Consistency, Isolation, Durability) 준수: 트랜잭션을 지원합니다.
  • 서버가 필요 없음: 클라이언트-서버 모델이 아닌 로컬 스토리지 방식입니다.
  • C 언어로 구현: 가볍고 빠른 성능을 제공합니다.

3. Android에서 SQLite 구조

Android에서는 android.database.sqlite 패키지를 통해 SQLite를 활용할 수 있습니다. 주요 클래스로는 SQLiteDatabase, SQLiteOpenHelper, Cursor 등이 있습니다.

3.1. SQLiteDatabase 클래스

SQLiteDatabase 클래스는 데이터베이스의 CRUD(Create, Read, Update, Delete) 연산을 수행하는 핵심 클래스입니다.

SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase("/data/data/com.example.app/databases/mydb.db", null);

주요 메서드는 다음과 같습니다:

  • execSQL(String sql): SQL 쿼리를 실행합니다 (SELECT 제외).
  • rawQuery(String sql, String[] selectionArgs): SELECT 쿼리를 실행하고 Cursor를 반환합니다.
  • insert(String table, String nullColumnHack, ContentValues values): 데이터를 삽입합니다.
  • update(String table, ContentValues values, String whereClause, String[] whereArgs): 데이터를 수정합니다.
  • delete(String table, String whereClause, String[] whereArgs): 데이터를 삭제합니다.

3.2. SQLiteOpenHelper 클래스

데이터베이스의 생성과 버전 관리를 위한 헬퍼 클래스입니다.

public class MyDatabaseHelper extends SQLiteOpenHelper {

    public MyDatabaseHelper(Context context) {
        super(context, "mydb.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS users");
        onCreate(db);
    }
}

3.3. Cursor 클래스

쿼리 결과를 관리하는 인터페이스로, 결과 집합을 순회할 수 있도록 돕습니다.

Cursor cursor = db.rawQuery("SELECT * FROM users", null);
while (cursor.moveToNext()) {
    int id = cursor.getInt(cursor.getColumnIndex("id"));
    String name = cursor.getString(cursor.getColumnIndex("name"));
}
cursor.close();

4. AOSP에서 SQLite 관련 코드 분석

Android의 SQLite 라이브러리는 AOSP에서 frameworks/base/core/java/android/database/sqlite/ 경로에 위치하고 있습니다. 주요 클래스들을 살펴보겠습니다.

4.1. SQLiteDatabase.java

SQLiteDatabase 클래스는 데이터베이스의 핸들러 역할을 합니다. 주요 메서드는 다음과 같습니다.

public void execSQL(String sql) throws SQLException {
    executeSql(sql, null);
}

위 코드를 보면 내부적으로 executeSql() 메서드를 호출하여 SQL 문을 실행하는 것을 확인할 수 있습니다.

4.2. SQLiteStatement.java

SQL 문을 실행하는 역할을 합니다.

public void execute() {
    acquireReference();
    try {
        getSession().execute(this.mSql, this.mBindArgs, this.mConnectionFlags, null);
    } finally {
        releaseReference();
    }
}

4.3. SQLiteCursor.java

쿼리 결과를 관리하는 클래스입니다.

public boolean moveToNext() {
    return moveToPosition(mPos + 1);
}

쿼리 결과를 순회하는 기본적인 동작을 정의하고 있습니다.

5. Native 코드 분석

SQLite의 핵심 기능은 Native 코드에서 처리되며, frameworks/base/core/jni/android_database_SQLiteConnection.cpp 파일에서 확인할 수 있습니다.

5.1. nativeExecute 메서드

이 메서드는 Java의 execSQL()과 연동됩니다.

static void nativeExecute(JNIEnv* env, jobject object, jlong connectionPtr, jstring sql) {
    SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr);
    connection->execute(env, sql);
}

SQLite 실행은 C++ SQLiteConnection 클래스를 통해 수행됩니다.

6. 결론

Android에서 SQLite는 android.database.sqlite 패키지를 통해 제공되며, SQLiteDatabase, SQLiteOpenHelper, Cursor 등의 클래스를 사용하여 데이터베이스 조작이 가능합니다. 내부적으로는 AOSP의 Java 코드와 Native 코드가 결합되어 SQLite 쿼리를 실행하며, 이를 통해 데이터 저장 및 검색이 이루어집니다.

본 포스팅에서는 SQLite의 구조와 주요 클래스를 분석하고, AOSP의 관련 코드를 살펴보았습니다. SQLite는 Android 애플리케이션 개발에서 필수적인 요소로, 이를 깊이 이해하면 보다 효율적인 데이터베이스 활용이 가능할 것입니다.

반응형