← Назад к вопросам

Какая база данных используется по умолчанию в Android?

1.0 Junior🔥 201 комментариев
#Работа с данными

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

База данных в Android

По умолчанию в Android используется SQLite. Это встроенная, легковесная реляционная БД.

SQLite - встроенная база

Характеристики:

  • Встроена в Android (не нужна отдельная установка)
  • Реляционная база данных (SQL)
  • Хранится как файл на устройстве
  • Легкая и быстрая
  • Поддерживает ACID транзакции
// Использование SQLite через SQLiteOpenHelper
class DatabaseHelper(context: Context) : SQLiteOpenHelper(
    context,
    DATABASE_NAME,
    null,
    DATABASE_VERSION
) {
    companion object {
        const val DATABASE_NAME = "users.db"
        const val DATABASE_VERSION = 1
    }
    
    override fun onCreate(db: SQLiteDatabase) {
        val createTableSQL = """
            CREATE TABLE users (
                id INTEGER PRIMARY KEY,
                name TEXT NOT NULL,
                email TEXT NOT NULL
            )
        """.trimIndent()
        db.execSQL(createTableSQL)
    }
    
    override fun onUpgrade(
        db: SQLiteDatabase,
        oldVersion: Int,
        newVersion: Int
    ) {
        db.execSQL("DROP TABLE IF EXISTS users")
        onCreate(db)
    }
}

Место хранения SQLite

данные приложения:
/data/data/com.example.app/databases/users.db

Использование через Room (рекомендуется)

@Entity(tableName = "users")
data class User(
    @PrimaryKey val id: Int,
    val name: String,
    val email: String
)

@Dao
interface UserDao {
    @Insert
    suspend fun insert(user: User)
    
    @Query("SELECT * FROM users WHERE id = :userId")
    suspend fun getUser(userId: Int): User
    
    @Update
    suspend fun update(user: User)
    
    @Delete
    suspend fun delete(user: User)
}

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
    
    companion object {
        private var instance: AppDatabase? = null
        
        fun getInstance(context: Context): AppDatabase {
            return instance ?: synchronized(this) {
                Room.databaseBuilder(
                    context,
                    AppDatabase::class.java,
                    "app_database.db"
                ).build().also { instance = it }
            }
        }
    }
}

Прямое использование SQLiteDatabase

val db = databaseHelper.writableDatabase

// Вставка
val values = ContentValues().apply {
    put("name", "John")
    put("email", "john@example.com")
}
val rowId = db.insert("users", null, values)

// Чтение
val cursor = db.query(
    "users",
    arrayOf("id", "name", "email"),
    "id = ?",
    arrayOf("1"),
    null,
    null,
    null
)

while (cursor.moveToNext()) {
    val id = cursor.getInt(0)
    val name = cursor.getString(1)
    val email = cursor.getString(2)
}
cursor.close()

// Обновление
val updateValues = ContentValues().apply {
    put("name", "Jane")
}
db.update("users", updateValues, "id = ?", arrayOf("1"))

// Удаление
db.delete("users", "id = ?", arrayOf("1"))

Транзакции

db.beginTransaction()
try {
    // Несколько операций
    db.insert("users", null, values1)
    db.insert("users", null, values2)
    db.insert("users", null, values3)
    
    db.setTransactionSuccessful()  // Подтвердить
} finally {
    db.endTransaction()
}

// Или в корутине с Room
appDatabase.withTransaction {
    userDao.insert(user1)
    userDao.insert(user2)
    userDao.insert(user3)
}

SharedPreferences - альтернатива для простых данных

// Для простых данных (не БД)
val prefs = context.getSharedPreferences("app_prefs", Context.MODE_PRIVATE)

// Сохранение
prefs.edit().apply {
    putString("username", "John")
    putInt("age", 30)
    putBoolean("is_logged_in", true)
    apply()
}

// Чтение
val username = prefs.getString("username", "default")
val age = prefs.getInt("age", 0)
val isLoggedIn = prefs.getBoolean("is_logged_in", false)

DataStore - новая альтернатива SharedPreferences

val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")

class SettingsRepository(private val context: Context) {
    suspend fun saveUsername(username: String) {
        context.dataStore.edit { preferences ->
            preferences[stringPreferencesKey("username")] = username
        }
    }
    
    fun getUsername(): Flow<String> {
        return context.dataStore.data.map { preferences ->
            preferences[stringPreferencesKey("username")] ?: ""
        }
    }
}

Сравнение хранилищ

ХранилищеИспользованиеРазмерType-safe
SQLiteСложные данныеБольшойНет
RoomSQLite (recommended)БольшойДа
SharedPreferencesПростые параметрыМаленькийНет
DataStoreПростые параметрыМаленькийДа
Firebase RealtimeCloudОблакоНет
Cloud FirestoreCloudОблакоДа

Лучшие практики

✅ Делай так:

  • Используй Room для SQLite
  • Используй DataStore вместо SharedPreferences
  • Кешируй часто используемые данные
  • Используй транзакции для групповых операций
  • Выполняй БД операции на IO потоке

❌ Избегай:

  • Прямого использования SQLiteDatabase
  • SharedPreferences для больших объемов
  • БД операций на Main потоке
  • Блокирующих операций БД

Вывод

В Android по умолчанию используется SQLite:

  • Встроена и не требует установки
  • Реляционная БД (SQL)
  • Хранится в файле на устройстве
  • Лучше всего использовать через Room ORM
  • Для простых данных есть DataStore
Какая база данных используется по умолчанию в Android? | PrepBro