安卓開發入門教程-數據存儲_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
安卓開發入門教程系列匯總
開發語言學習
UI控件學習系列
UI控件_TextView
UI控件_EditText
UI控件_Button
UI控件_ImageView
UI控件_RadioButton
UI控件_CheckBox
UI控件_ProgressBar
關注頭條號,第一時間獲取最新文章:
智能推薦
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的小白級使用方法。自己剛開始學的時候踩過的坑,給大家標出來,供大家參考,也算是記錄我的學習過程,我將以用戶注冊驗證登錄信息為例。 剛開始學的時候,數據庫的查詢方法在網上看了很多,視頻啊、博文等等,都沒有我要的效果,講的說實話我有點看不懂,畢竟剛開始學嘛。思路就是用戶注冊即信息入庫;用戶登錄即查詢數據庫,對表,看信息與輸入是否一致。好了廢話就這么多,趕緊讓我們來看看吧: 所...
猜你喜歡
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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...