12/08/2018, 15:42

Sử dụng OrmLite trong Kotlin

Kotlin hiện đã là một ngôn ngữ được dùng thường xuyên trong lập trình Android, đã có rất nhiều những bài post về sự hữu dụng của Kotlin, ở đây mình muốn hướng dẫn thêm về cách sử dụng OrmLite trong những ứng dụng Android viết bằng Kotlin. Bài toán đặt ra ở đây là mình muốn tạo và lưu 2 bảng Movie ...

Kotlin hiện đã là một ngôn ngữ được dùng thường xuyên trong lập trình Android, đã có rất nhiều những bài post về sự hữu dụng của Kotlin, ở đây mình muốn hướng dẫn thêm về cách sử dụng OrmLite trong những ứng dụng Android viết bằng Kotlin. Bài toán đặt ra ở đây là mình muốn tạo và lưu 2 bảng Movie và User sau khi lấy dữ liệu từ api vào trong database. Đầu tiên, chúng ta cần import ormlite vào dự án trong build.gradle, mình đang ví dụ sử dụng version 4.48

compile 'com.j256.ormlite:ormlite-android:4.48'

Tiếp theo ta tạo hai object Movie và User có cấu trúc như sau:

@DatabaseTable(tableName = "movie_table")
data class Movie(
    @DatabaseField var posterPath: String? = null,
    @DatabaseField var isAdult: Boolean = false,
    @DatabaseField var overview: String? = null,
    @DatabaseField var releaseDate: String? = null,
    @DatabaseField var id: Int? = 0,
    @DatabaseField var originalTitle: String? = null,
    @DatabaseField var originalLanguage: String? = null,
    @DatabaseField var title: String? = null,
    @DatabaseField var backdropPath: String? = null,
    @DatabaseField var popularity: Double? = null,
    @DatabaseField var voteCount: Int? = null,
    @DatabaseField var rating: Number? = null) {
}
@DatabaseTable(tableName = "user_table")
data class User(
    @DatabaseField val avatar: Avatar?,
    @DatabaseField var id: Int?,
    @DatabaseField var language: String?,
    @DatabaseField var name: String?,
    @DatabaseField var includeAdult: Boolean?,
    @DatabaseField var username: String?) {
}

Sau đó ta tạo config util và helper giúp tạo các table trong database, mình ví dụ chúng ta lưu vào file ormlite_config.txt đặt trong raw

class DatabaseConfigUtil : com.j256.ormlite.android.apptools.OrmLiteConfigUtil() {
  companion object {
    private val classes = arrayOf<Class<*>>(
        com.moviedbtraining.model.Movie::class.java, com.moviedbtraining.model.User::class.java)
    @Throws(java.sql.SQLException::class, java.io.IOException::class)
    fun main(args: Array<String>) {
      com.j256.ormlite.android.apptools.OrmLiteConfigUtil.writeConfigFile("ormlite_config.txt",
          com.moviedbtraining.data.source.local.DatabaseConfigUtil.Companion.classes)
    }
  }
}
class DatabaseHelper : OrmLiteSqliteOpenHelper {

  var mContext: Context? = null

  public constructor(context: Context, databaseName: String, factory: SQLiteDatabase.CursorFactory,
      databaseVersion: Int) : super(context, databaseName, factory, databaseVersion,
      R.raw.ormlite_config) {
    this.mContext = context
  }

  public constructor(context: Context) : super(context, DATABASE_NAME, null, DATABASE_VERSION,
      R.raw.ormlite_config) {
    this.mContext = context
  }

  override fun onCreate(database: SQLiteDatabase?, connectionSource: ConnectionSource?) {
    try {
      TableUtils.createTable(connectionSource, Movie::class.java)
      TableUtils.createTable(connectionSource, User::class.java)
    } catch (e: SQLException) {
      e.printStackTrace()
    }
  }

  override fun onUpgrade(database: SQLiteDatabase?, connectionSource: ConnectionSource?,
      oldVersion: Int, newVersion: Int) {
    TableUtils.dropTable<Movie, Any>(connectionSource, Movie::class.java, true)
    TableUtils.dropTable<User, Any>(connectionSource, User::class.java, true)
    onCreate(database, connectionSource)
  }

  companion object {
    private val DATABASE_NAME = "moviedb.db"
    private val DATABASE_VERSION = BuildConfig.DATABASE_VERSION
  }
}

Ta thêm database vesion trong defaultConfig của build.gradle, mình đang để là 1

buildConfigField "int", "DATABASE_VERSION", "1";

Như vậy ta đã gọi xong các hàm để tạo bảng trong database, tiếp theo chúng ta sẽ lưu vào bảng và gọi ra khi cần thiết

Khởi tạo DatabaseHelper trong activity

private var mDatabaseHelper: DatabaseHelper? = null
private fun getHelper(): DatabaseHelper {
    if (mDatabaseHelper == null) {
      mDatabaseHelper = OpenHelperManager.getHelper(this, DatabaseHelper::class.java)
    }
    return mDatabaseHelper!!
  }

Lưu vào database:

private fun addToDB(mList: MutableList<Movie>) {
    try {
      val movieDao = getHelper().getDao(Movie::class.java)
      for (movie in mList) {
        movieDao!!.create(movie)
      }
    } catch (e: SQLException) {
      e.printStackTrace()
    }
  }

Gọi ra khi cần:

private fun showDB() {
    val movieDao = getHelper().getDao(Movie::class.java)
    var mMovieList: MutableList<Movie> = mutableListOf()
    mMovieList = movieDao!!.queryForAll() as MutableList<Movie>
    //TODO: using mMovieList for something
  }

Như vậy chúng ta đã sử dụng OrmLite một cách đơn giản với Kotlin trong Android. Mong rằng bài hướng dẫn này sẽ giúp phần nhỏ nào đấy cho các bạn khi mới sử dụng Kotlin để lập trình Android.

0