Sobes.tech
Middle

Ինչպե՞ս կստեղծեիք տվյալների բազա մոբայլ հավելվածի համար։

sobes.tech AI

Պատասխան AI-ից

Լոկալ տվյալների բազա ստեղծելու համար Android-ում ես օգտագործում էի Room Persistence Library:

Սա SQLite-ի վրա հիմնված ամպլիտուդ է, որը հեշտացնում է տվյալների բազայի հետ աշխատելը՝ տրամադրելով նշանագրված API՝ սքեմաների, հարցումների և միգրացիաների կառավարման համար:

Հիմնական քայլերը՝

  1. Ավելացնել կախվածությունները:

    // build.gradle (հավելվածի մակարդակ)
    dependencies {
        implementation("androidx.room:room-runtime:2.6.1")
        annotationProcessor("androidx.room:room-compiler:2.6.1") // Java-ի համար
        kapt("androidx.room:room-compiler:2.6.1") // Kotlin-ի համար
        implementation("androidx.room:room-ktx:2.6.1") // Կորուտինների համար
    }
    
  2. Ստեղծել սուբյեկտներ (Entities): POJO կամ data դասեր, որոնք ներկայացնում են սեղանները տվյալների բազայում։ @Entity, @PrimaryKey, @ColumnInfo նշանագրերը օգտագործվում են կառուցվածքը սահմանելու համար:

    @Entity(tableName = "users")
    data class User(
        @PrimaryKey(autoGenerate = true) val id: Int = 0,
        @ColumnInfo(name = "first_name") val firstName: String?,
        @ColumnInfo(name = "last_name") val lastName: String?
    )
    
  3. Ստեղծել DAO (Data Access Objects): Ինտերֆեյսներ, որոնք սահմանում են տվյալների մուտքի մեթոդները (մուտքագրում, հեռացում, թարմացում, հարցումներ): @Dao, @Insert, @Delete, @Update, @Query նշանագրերը օգտագործվում են գործողությունների սահմանման համար:

    @Dao
    interface UserDao {
        @Query("SELECT * FROM users")
        fun getAll(): List<User>
    
        @Insert
        fun insertAll(vararg users: User)
    
        @Delete
        fun delete(user: User)
    }
    
  4. Ստեղծել Database-դասը: Աբստրակտ դաս, որը ժառանգում է RoomDatabase, տրամադրում է DAO-ներին մուտք և սահմանում է տվյալների բազայի սքեման։ @Database նշանագրերը օգտագործվում են սուբյեկտների և բազայի տարբերակի համար:

    @Database(entities = [User::class], version = 1)
    abstract class AppDatabase : RoomDatabase() {
        abstract fun userDao(): UserDao
    
        companion object {
            @Volatile
            private var INSTANCE: AppDatabase? = null
    
            fun getDatabase(context: Context): AppDatabase {
                return INSTANCE ?: synchronized(this) {
                    val instance = Room.databaseBuilder(
                        context.applicationContext,
                        AppDatabase::class.java,
                        "app_database"
                    ).build()
                    INSTANCE = instance
                    instance
                }
            }
        }
    }
    
  5. Տվյալների հետ աշխատել: Ստանալ բազայի օրինակ և կատարել գործողություններ DAO-ով:

    val db = AppDatabase.getDatabase(applicationContext)
    val userDao = db.userDao()
    
    // Տվյալների մուտքագրում (հաճախ ֆոնային թելում)
    GlobalScope.launch {
        userDao.insertAll(User(firstName = "John", lastName = "Doe"))
    }
    
    // Տվյալների ստացում
    GlobalScope.launch {
        val users = userDao.getAll()
    }
    

Առավելությունները՝

  • Համակարգչային ստուգում հարցումների: SQL հարցումները ստուգվում են կոմպիլյացիայի ժամանակ, ինչը նվազեցնում է սխալների քանակը:
  • Հեշտ գործել ֆոնային հոսքերի հետ: Կորուտինների կամ LiveData-ի ինտեգրացիան հեշտացնում է ֆոնային տվյալների աշխատանքը:
  • Անհրաժեշտության դեպքում հեշտ միգրացիա: Տրամադրում է գործիքներ սքեմայի փոփոխությունների կառավարման համար:
  • Փոքր քանակությամբ բլոկային կոդ՝ համեմատած նատիվ SQLite-ի:

Եթե պահանջները շատ հատուկ կամ շատ փոքր էին, հնարավոր էր օգտագործել Shared Preferences՝ պարզ key-value զույգերի համար, բայց կառուցվածքային տվյալների և հարցումների համար Room-ը նախընտրելի է։ Ավելի բարդ սցենարների համար՝ սինխրոնացման կամ տարբեր աղբյուրներից (օրինակ՝ վեբ) մուտքի անհրաժեշտությամբ, կարելի է դիտարկել ամպային տվյալների բազաներ, ինչպիսիք են Firebase Realtime Database կամ Firestore, բայց տեղական պահեստավորման համար Room-ը ստանդարտ և խորհուրդ է տրված լուծում։