ตอนที่ 9 Android Studio Kotlin การทำงานกับฐานข้อมูล SQLite

Android Studio พร้อมคุณสมบัติอันทรงพลังและเป็นมิตรกับผู้ใช้ เป็น IDE การรับทำแอพ Android Kotlin กลายเป็นภาษาโปรแกรมที่ต้องการทำแอพ Android ด้วยความกระชับ อ่านง่าย และทำงานร่วมกันได้กับ Java สิ่งสำคัญที่สุดประการหนึ่งของทำแอพคือความสามารถในการจัดเก็บ เข้าถึง และจัดการข้อมูล SQLite เป็นเครื่องมือฐานข้อมูลที่มีน้ำหนักเบาและไร้เซิร์ฟเวอร์ ซึ่งเหมาะสำหรับการทำแอพ Android Studio ที่ต้องการฐานข้อมูลในเครื่อง ในบทความนี้ เราจะสำรวจขั้นตอนสำหรับการรวม SQLite กับโครงการ Android Studio Kotlin

1. การตั้งค่าโครงการ (Project)

ขั้นแรก สร้างโปรเจ็กต์ Android Studio ใหม่โดยใช้ภาษา Kotlin เลือกชื่อโครงการ ชื่อแพ็คเกจ และตำแหน่งบันทึกที่เหมาะสม ตรวจสอบให้แน่ใจว่าได้เลือกฟอร์มแฟกเตอร์ “โทรศัพท์และแท็บเล็ต” และตั้งค่าระดับ API ขั้นต่ำตามความต้องการของคุณ เมื่อสร้างโปรเจ็กต์แล้ว คุณก็พร้อมที่จะเริ่มผสานรวม SQLite

2. การเพิ่ม Dependencies

ในการทำงานกับ SQLite ใน Kotlin คุณต้องเพิ่มการพึ่งพาที่จำเป็นในโครงการของคุณ เปิดไฟล์ build.gradle (โมดูล) และเพิ่มการอ้างอิงต่อไปนี้ในส่วน “dependencies”:

implementation 'androidx.sqlite:sqlite:2.1.0'
implementation 'androidx.room:room-runtime:2.3.0'
kapt 'androidx.room:room-compiler:2.3.0'

อย่าลืมซิงค์โครงการหลังจากเพิ่ม dependencies

3. การกำหนด Schema ฐานข้อมูล

ในการสร้างฐานข้อมูลใน SQLite คุณต้องกำหนด Schema Schema เป็นพิมพ์เขียวที่อธิบายโครงสร้างของฐานข้อมูลของคุณ รวมถึงตารางและคอลัมน์ หากต้องการกำหนด Schema ให้สร้างคลาสข้อมูล Kotlin ใหม่ที่แสดงถึงตารางและคอลัมน์ ตัวอย่างเช่น:

@Entity(tableName = "user_table")
data class User(
    @PrimaryKey(autoGenerate = true)
    val id: Int,
    val name: String,
    val age: Int
)

ที่นี่ คำอธิบายประกอบ @Entity แสดงถึงตารางในฐานข้อมูล และคำอธิบายประกอบ @PrimaryKey แสดงถึงคอลัมน์คีย์หลัก

4. การสร้าง Object การเข้าถึงฐานข้อมูล (DAO)

จากนั้น สร้าง Database Access Object (DAO) เพื่อกำหนดวิธีการเข้าถึงและจัดการข้อมูลในฐานข้อมูล DAO ควรเป็นอินเทอร์เฟซหรือคลาสนามธรรมที่มีคำอธิบายประกอบ @Dao ตัวอย่างเช่น:

@Dao
interface UserDao {
    @Insert
    suspend fun insert(user: User): Long

    @Update
    suspend fun update(user: User): Int

    @Delete
    suspend fun delete(user: User): Int

    @Query("SELECT * FROM user_table")
    fun getAllUsers(): LiveData<List<User>>
}

DAO ใช้คำอธิบายประกอบต่างๆ เช่น @Insert, @Update, @Delete และ @Query เพื่อกำหนดการปฏิบัติการฐานข้อมูล

5. การสร้างฐานข้อมูล

ในการสร้างฐานข้อมูล SQLite คุณต้องกำหนดคลาสที่ขยาย RoomDatabase คลาสนี้ควรใส่คำอธิบายประกอบด้วย @Database และรวมเอนทิตีและ DAO สำหรับฐานข้อมูล ตัวอย่างเช่น:

@Database(entities = [User::class], version = 1, exportSchema = false)
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
            }
        }
    }
}

ฟังก์ชัน `getDatabase` ใน ‘companion object’ มีหน้าที่สร้างอินสแตนซ์ซิงเกิลตันของคลาส ‘AppDatabase’ สิ่งนี้ทำให้มั่นใจได้ว่ามีการสร้างฐานข้อมูลเพียงอินสแตนซ์เดียวตลอดวงจรชีวิตของแอปพลิเคชัน

6. การเข้าถึงฐานข้อมูล

ในการเข้าถึงฐานข้อมูล ให้สร้าง ViewModel เพื่อสื่อสารระหว่างส่วนประกอบ UI และฐานข้อมูล ViewModel ควรมีฟังก์ชันที่จำเป็นสำหรับการเพิ่ม อัปเดต ลบ และดึงข้อมูลจากฐานข้อมูล

class UserViewModel(application: Application) : AndroidViewModel(application) {
    private val repository: UserRepository
    val allUsers: LiveData<List<User>>

    init {
        val userDao = AppDatabase.getDatabase(application).userDao()
        repository = UserRepository(userDao)
        allUsers = repository.allUsers
    }

    suspend fun insert(user: User) {
        repository.insert(user)
    }

    suspend fun update(user: User) {
        repository.update(user)
    }

    suspend fun delete(user: User) {
        repository.delete(user)
    }
}

สร้างคลาส UserRepository เพื่อ abstract แหล่งข้อมูลจาก ViewModel

class UserRepository(private val userDao: UserDao) {
    val allUsers: LiveData<List<User>> = userDao.getAllUsers()

    suspend fun insert(user: User) {
        userDao.insert(user)
    }

    suspend fun update(user: User) {
        userDao.update(user)
    }

    suspend fun delete(user: User) {
        userDao.delete(user)
    }
}

7. การใช้งาน (Implementing) UI

สุดท้าย ใช้ส่วนประกอบ UI เพื่อโต้ตอบกับฐานข้อมูล SQLite ในกิจกรรมหรือแฟรกเมนต์ ให้สร้างอินสแตนซ์ของ ViewModel โดยใช้ ViewModelProvider จากนั้น ใช้ฟังก์ชันของ ViewModel เพื่อแทรก อัปเดต ลบ และดึงข้อมูลจากฐานข้อมูล

class MainActivity : AppCompatActivity() {
    private lateinit var userViewModel: UserViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        userViewModel = ViewModelProvider(this).get(UserViewModel::class.java)

        // Observe the changes in the database and update the UI accordingly.
        userViewModel.allUsers.observe(this, Observer { users ->
            // Update UI with the new list of users.
        })

        // Insert, update, or delete a user by calling the appropriate function on the ViewModel.
        // For example, to insert a new user:
        val user = User(0, "John Doe", 30)
        lifecycleScope.launch {
            userViewModel.insert(user)
        }
    }
}

การรวม SQLite กับโครงการ Android Studio Kotlin เป็นกระบวนการที่ไม่ซับซ้อน ด้วยการใช้ไลบรารีการคงอยู่ของห้องและปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุด เช่น การสร้าง ViewModel และ Repository คุณสามารถทำแอพที่มีประสิทธิภาพและปรับขนาดได้ด้วยฐานข้อมูลในเครื่อง ด้วยคำแนะนำนี้ ตอนนี้คุณมีความรู้ในการใช้ SQLite ในรับทำแอพ Android ที่ใช้ Kotlin ของอย่างมีประสิทธิภาพ

เขียนแอพ Android Studio

ตอนที่ 8 Android Studio Kotlin บันทึกข้อมูลโดยใช้ SharedPreferences
ตอนที่ 10 Android Studio Kotlin การเชื่อมต่ออินเตอร์เน็ตด้วย HTTP(s)