• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 安卓開發入門教程-數據存儲_SQLite數據庫

    標簽: 安卓開發零基礎入門

    關注 安卓007 ,免費獲取全套安卓開發學習資料

    什么是SQLite數據庫

    SQLite數據庫是適合在移動設備上使用的輕量型關系型數據庫,速度快,占用空間小.與SharedPreferences適合存儲少量簡單類型數據相反,SQLite數據庫適合存儲大量復雜類型的數據.
    安卓原生提供了操作數據庫的API接口,但是操作較為繁雜,于是涌現了大量第三方的開源操作庫,如GreenDAO、Realm等.但Google最新推出Jetpack全家桶,自帶Room數據庫操作庫,使用上方便快捷,同時可以和Jetpack中的其他庫結合,高效完成開發.

    基礎樣例

    1. 采用安卓原生方式操作數據庫

    a. 效果圖:


    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XwhRNhnT-1598402428745)(https://upload-images.jianshu.io/upload_images/6169789-0121b82ea983be9e.gif?imageMogr2/auto-orient/strip)]

    b. 使用方法

    1). 添加數據庫輔助操作類

    /**
     * 數據庫輔助操作類
     */
    class DbHelper
        (context: Context?, databaseName: String, version: Int) : SQLiteOpenHelper(
        context, databaseName, null, version
    ) {
        //創建用戶表的sql語句,表名:user_table,包含主鍵_id,用戶名字段:user_name。
        private var createUserTableSql =
            ("CREATE TABLE user_table(_id INTEGER PRIMARY KEY, user_name text)")
    
        /**
         * 創建數據庫表
         */
        override fun onCreate(db: SQLiteDatabase) {
            db.execSQL(createUserTableSql)
        }
    
        /**
         * 數據庫升級
         */
        override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
            val sql = "DROP TABLE IF EXISTS user_table"
            db.execSQL(sql)
            onCreate(db)
        }
    
        /**
         * 插入數據
         */
        fun insert(tableName: String, cv: ContentValues) = writableDatabase.insert(tableName, null, cv)
    
        /**
         * 刪除指定數據
         */
        fun delete(tableName: String, id: Int): Int {
            val where = "_id = ?"
            val whereValue = arrayOf(id.toString())
            return writableDatabase.delete(tableName, where, whereValue)
        }
    
        /**
         * 刪除所有數據
         */
        fun deleteAll(tableName: String) = writableDatabase.delete(tableName, null, null)
    
        /**
         * 更新數據
         */
        fun update(
            tableName: String, values: ContentValues, whereClause: String?, whereArgs: Array<String>?
        ) = writableDatabase.update(tableName, values, whereClause, whereArgs)
    
        /**
         * 查詢數據,返回一個指定數據集合的游標
         */
        fun query(tableName: String): Cursor {
            return readableDatabase.query(tableName, null, null, null, null, null, null)
        }
    }
    

    2). Activity中進行調用

    • Activity代碼
    class MainActivity : AppCompatActivity() {
        private lateinit var dbHelper: DbHelper
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            dbHelper = DbHelper(this, "user_database", 1)
    
            addDataBtn.setOnClickListener { addUser() }
            updateDataBtn.setOnClickListener { updateUser() }
            delDataBtn.setOnClickListener { delUser() }
            queryDataBtn.setOnClickListener { queryUser() }
        }
    
        /**
         * 新增數據
         */
        private fun addUser() {
            val values = ContentValues().apply {
                put("user_name", "張三")
            }
            dbHelper.insert("user_table", values)
        }
    
        /**
         * 更新數據
         */
        private fun updateUser() {
            val values = ContentValues().apply {
                put("user_name", "李四")
            }
            dbHelper.update("user_table", values, null, null)
        }
    
        /**
         * 刪除數據
         */
        private fun delUser() {
            dbHelper.deleteAll("user_table")
        }
    
        /**
         * 查詢數據
         */
        private fun queryUser() {
            val cursor = dbHelper.query("user_table")
            if (cursor.moveToFirst()) {
                do {
                    val id = cursor.getInt(cursor.getColumnIndex("_id"))
                    val name = cursor.getString(cursor.getColumnIndex("user_name"))
                    Log.d("MainActivity", "用戶:${id}_$name")
                } while (cursor.moveToNext())
            } else {
                Log.d("MainActivity", "數據庫是空的!")
            }
            cursor.close()
        }
    }
    
    • Activity對應布局文件
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical">
        <Button
            android:id="@+id/addDataBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="新增數據" />
        <Button
            android:id="@+id/updateDataBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="更新數據" />
        <Button
            android:id="@+id/delDataBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="刪除數據" />
        <Button
            android:id="@+id/queryDataBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="查詢數據" />
    </LinearLayout>
    

    2. 采用Room操作數據庫

    a. 效果圖:

    b. 使用方法

    1). 在app模塊的build.gradle文件中增加依賴:

    //集成room進行SQLite數據庫操作
    implementation "androidx.room:room-runtime:2.2.5"
    kapt "androidx.room:room-compiler:2.2.5"
    
    //集成協程coroutines進行異步操作
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0"
    

    2). 定義數據類:

    /**
     * 測試用的用戶數據類,包含自動生成值的主鍵id字段,用戶名字段。
     */
    @Entity(tableName = "user_table")
    class User(
        @PrimaryKey(autoGenerate = true) var id: Long = 0,
        @ColumnInfo(name = "user_name") var name: String = ""
    )
    

    3). 定義數據庫表操作類

    /**
     * 用戶數據庫表操作類
     */
    @Dao
    public interface UserDao {
        //新增數據
        @Insert
        long[] add(User... users);
    
        @Update
        void update(User... users);
    
        //刪除所有數據
        @Query("DELETE FROM USER_TABLE")
        void deleteAll();
    
        //查詢出所有數據
        @Query("SELECT * FROM USER_TABLE")
        List<User> query();
    }
    

    4). 創建數據庫類

    /**
     * 數據庫類,用于創建數據庫及對所有數據庫表進行操作。
     * 所有的數據庫表類都放在entities里,通過逗號分隔;
     * version表示當前的數據庫版本號,如果應用發布后,又對數據庫結構做了修改,則需要變更版本號(一般加1即可)
     */
    @Database(entities = [User::class], version = 1, exportSchema = false)
    abstract class AppDatabase : RoomDatabase() {
        //所有數據庫表操作類都放在這里
        abstract val userDao: UserDao
    
        companion object {
            //自定義數據庫文件名,只要在應用內不存在多個同名的數據庫文件即可。
            private const val DATABASE_NAME = "user_database"
    
            @Volatile
            private var instance: AppDatabase? = null
    
            @Synchronized
            fun getInstance(context: Context) =
                instance
                    ?: buildDatabase(context)
                        .also { instance = it }
    
            private fun buildDatabase(context: Context) =
                Room.databaseBuilder(context, AppDatabase::class.java,
                    DATABASE_NAME
                ).build()
        }
    }
    

    5). Activity中進行調用

    • Activity代碼
    class MainActivity : AppCompatActivity() {
        //記錄最后一次新增的用戶id,用于標識待更新的用戶
        private var lastAddedUserId: Long = 0
        private lateinit var userDao: UserDao
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            userDao = AppDatabase.getInstance(this).userDao
            addDataBtn.setOnClickListener { addUser() }
            updateDataBtn.setOnClickListener { updateUser() }
            delDataBtn.setOnClickListener { delUser() }
            queryDataBtn.setOnClickListener { queryUser() }
        }
    
        private fun addUser() {
            GlobalScope.async {
                var result = userDao.add(User(name = "張三"))
                lastAddedUserId = result[0]
            }
        }
    
        private fun updateUser() {
            val user = User(id = lastAddedUserId, name = "李四")
    
            GlobalScope.async {
                userDao.update(user)
            }
        }
    
        private fun delUser() {
            GlobalScope.async {
                userDao.deleteAll()
            }
        }
    
        private fun queryUser() {
            GlobalScope.async {
                val dataList = userDao.query()
                if (dataList.isNotEmpty()) {
                    dataList.forEach { Log.d("MainActivity", "用戶:${it.id}_${it.name}") }
                } else {
                    Log.d("MainActivity", "數據庫是空的!")
                }
            }
        }
    }
    
    • Activity對應布局文件
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical">
        <Button
            android:id="@+id/addDataBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="新增數據" />
        <Button
            android:id="@+id/updateDataBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="更新數據" />
        <Button
            android:id="@+id/delDataBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="刪除數據" />
        <Button
            android:id="@+id/queryDataBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="查詢數據" />
    </LinearLayout>
    

    完整源代碼

    https://gitee.com/cxyzy1/DatabaseDemo


    安卓開發入門教程系列匯總

    開發語言學習

    Kotlin語言基礎

    UI控件學習系列

    UI控件_TextView
    UI控件_EditText
    UI控件_Button
    UI控件_ImageView
    UI控件_RadioButton
    UI控件_CheckBox
    UI控件_ProgressBar

    關注頭條號,第一時間獲取最新文章:

    版權聲明:本文為yinxing2008原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/yinxing2008/article/details/108232749

    智能推薦

    cache數據庫入門教程

    1.建立csp文件  2.保存到dthealth/web/csp下 3.進入demo 1 網頁系統配置->菜單管理,將它放到注冊建卡菜單下,菜單項名為培訓測試  4.找到剛才的網頁,允許通過為Demo Group  5.更新,注冊建卡里就有了這個csp  上一篇 IIS配置問題 1..MAC文件是m語言,下面是test111.MAC 最上面的...

    HDU-安卓程序開發之讀寫資源文件/SQLite數據庫/數據共享

    前言 這次為了做更好看的界面,更新了一下android studio到4.1.1 踩了很多坑,最后還是手機熱點+梯子下載安裝包,在線更新gradle弄好的,然后新建一個工程又出問題 (我和我的室友的問題不一樣,這里闡述一下我遇到的問題和解決方案https://blog.csdn.net/cshoney/article/details/90142447) 不多說了,開搞! 界面 讀寫資源文件 SQL...

    最全3種安卓存儲數據解析—SharedPreferenc存儲(實現自動登錄)+文件存儲(模擬備忘錄)+sqlite數據庫(模擬用戶登錄與管理)

    最全3種安卓存儲數據解析—SharedPreferenc存儲(實現自動登錄)+文件存儲(模擬備忘錄)+sqlite數據庫(模擬用戶登錄與管理) 今天來說說安卓存儲數據的三種方式的特點與其基本操作 1、SharedPreferenc存儲 特點:用來以最簡單的方式對數據進行永久保存的方法。hml文件格式存儲 使用Shared Preferenc存儲數據的步驟 下面來看例子: 代碼與詳解 2...

    安卓開發中到底怎么使用外部已經準備好的sqlite數據庫?

    忙碌了一天,總算摸清了里面的套路與步驟,現總結如下: 首先我們要知道,安卓是無法直接操作項目某個文件夾下的SQLite數據庫的,因此我們首先得把數據庫移到移動設備上/data/data/你的包名/databases文件夾下,安卓自己創建的數據庫也是放在這個地方。 第一步,檢查你項目res目錄下是否有raw文件夾,沒有的話就自己新建一個,如下所示: 第二步, 將想要移動的數據庫放進raw目錄下,如下...

    安卓開發之數據庫——SQLite的詳細介紹,詳細到連Alt+回車都有說

    安卓原生數據庫SQLite的小白級使用方法。自己剛開始學的時候踩過的坑,給大家標出來,供大家參考,也算是記錄我的學習過程,我將以用戶注冊驗證登錄信息為例。 剛開始學的時候,數據庫的查詢方法在網上看了很多,視頻啊、博文等等,都沒有我要的效果,講的說實話我有點看不懂,畢竟剛開始學嘛。思路就是用戶注冊即信息入庫;用戶登錄即查詢數據庫,對表,看信息與輸入是否一致。好了廢話就這么多,趕緊讓我們來看看吧: 所...

    猜你喜歡

    安卓持久化技術2—SQLite數據庫存儲_實現登錄注冊功能

    SQLite數據庫存儲_實現登錄注冊功能 注冊活動代碼 登錄活動代碼 SQLiteOpenHelper幫助類...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡