在Android中使用SQLite數(shù)據(jù)庫(kù)及其操作詳解
1. 創(chuàng)建數(shù)據(jù)庫(kù)表
首先,我們需要定義數(shù)據(jù)庫(kù)表的結(jié)構(gòu)。在 Android 中,這通常通過(guò) SQL 語(yǔ)句來(lái)實(shí)現(xiàn)。在 SQLiteOpenHelper 的 onCreate() 方法中執(zhí)行 SQL 語(yǔ)句來(lái)創(chuàng)建表。
String sql = "create table notepad(id integer primary key autoincrement, content text, time text)"; db.execSQL(sql);
id是主鍵,類(lèi)型為INTEGER,并且通過(guò)AUTOINCREMENT自動(dòng)遞增。content是用于存儲(chǔ)筆記內(nèi)容的文本字段。time是用于存儲(chǔ)時(shí)間信息的文本字段。
當(dāng)應(yīng)用程序第一次運(yùn)行時(shí),數(shù)據(jù)庫(kù)會(huì)通過(guò)執(zhí)行這條 CREATE TABLE 語(yǔ)句來(lái)創(chuàng)建 notepad 表。
2. 插入數(shù)據(jù)到數(shù)據(jù)庫(kù)
接下來(lái),我們定義一個(gè)方法,將數(shù)據(jù)插入到 notepad 表中。我們使用 execSQL() 方法來(lái)執(zhí)行 INSERT 語(yǔ)句。
public void insertNotepad(SQLiteDatabase db, String content, String time) {
String sql = "insert into notepad (content, time) values (?, ?)";
db.execSQL(sql, new Object[]{content, time});
}
insert into notepad (content, time):指定要插入的表名和列名。values (?, ?):占位符?用于安全地插入數(shù)據(jù)。這個(gè)寫(xiě)法能有效防止 SQL 注入攻擊。new Object[]{content, time}:創(chuàng)建一個(gè)Object數(shù)組,將content和time作為參數(shù)傳遞,依次替換 SQL 語(yǔ)句中的占位符?。
該方法會(huì)將指定的筆記內(nèi)容和時(shí)間插入到 notepad 表中,數(shù)據(jù)庫(kù)會(huì)自動(dòng)生成唯一的 id 值。
3. 執(zhí)行查詢(xún)操作
我們還需要從數(shù)據(jù)庫(kù)中查詢(xún)數(shù)據(jù)。下面的方法用于根據(jù) id 查詢(xún) notepad 表中的記錄。
public Cursor getNotepad(SQLiteDatabase db, int id) {
return db.rawQuery("select * from notepad where id = ?", new String[]{String.valueOf(id)});
}
select * from notepad where id = ?:這是一條SELECT查詢(xún)語(yǔ)句,用于檢索id等于特定值的記錄。?是占位符。new String[]{String.valueOf(id)}:將id轉(zhuǎn)換為字符串,并通過(guò)數(shù)組傳遞給 SQL 語(yǔ)句以替換占位符?。
調(diào)用此方法時(shí),會(huì)返回一個(gè) Cursor 對(duì)象,它包含查詢(xún)到的結(jié)果集。
4. 驗(yàn)證查詢(xún)結(jié)果
查詢(xún)到結(jié)果后,我們可以使用 Cursor 對(duì)象來(lái)遍歷結(jié)果并提取字段數(shù)據(jù)。
Cursor cursor = dbHelper.getNotepad(db, 1);
System.out.println("Query executed for record with id 1.");
if (cursor.moveToFirst()) {
int id = cursor.getInt(cursor.getColumnIndex("id"));
String content = cursor.getString(cursor.getColumnIndex("content"));
String time = cursor.getString(cursor.getColumnIndex("time"));
System.out.println("Record found: ID = " + id + ", Content = " + content + ", Time = " + time);
assertEquals(1, id);
assertEquals("Test content", content);
assertEquals("2024-08-23 12:00", time);
} else {
System.out.println("No record found.");
}
cursor.moveToFirst():將Cursor移動(dòng)到第一條記錄。如果有記錄存在,則返回true。cursor.getInt(cursor.getColumnIndex("id")):通過(guò)列名獲取id列的值。cursor.getString(cursor.getColumnIndex("content"))和cursor.getString(cursor.getColumnIndex("time")):分別獲取content和time列的值。
通過(guò)這些方法,我們可以提取查詢(xún)結(jié)果并輸出到控制臺(tái)。同時(shí),使用 assertEquals 方法來(lái)驗(yàn)證結(jié)果是否與預(yù)期一致。
5. 參數(shù)化查詢(xún)的安全性
在上述的 SQL 查詢(xún)語(yǔ)句中,我們使用了占位符 ?,并將實(shí)際參數(shù)通過(guò)數(shù)組傳遞到 SQL 語(yǔ)句中。這是一種參數(shù)化查詢(xún)的方式,可以有效防止 SQL 注入攻擊。通過(guò)參數(shù)化查詢(xún),你無(wú)需手動(dòng)拼接 SQL 語(yǔ)句,可以確保輸入的數(shù)據(jù)不會(huì)被惡意利用來(lái)修改 SQL 邏輯。
例如:
String sql = "select * from notepad where id = ?";
db.rawQuery(sql, new String[]{String.valueOf(id)});
這里的 new String[]{String.valueOf(id)} 創(chuàng)建了一個(gè)字符串?dāng)?shù)組,其中包含 id 的字符串形式。這個(gè)數(shù)組會(huì)替換 SQL 語(yǔ)句中的占位符 ?。
6. 代碼總結(jié)
通過(guò)這篇文章的示例,我們展示了如何在 Android 中使用 SQLite 數(shù)據(jù)庫(kù),創(chuàng)建表、插入數(shù)據(jù)、查詢(xún)數(shù)據(jù),并對(duì)查詢(xún)結(jié)果進(jìn)行驗(yàn)證。以下是代碼的完整實(shí)現(xiàn):
public class MyDbHelper extends SQLiteOpenHelper {
public MyDbHelper(Context context) {
super(context, "mydatabase.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table notepad(id integer primary key autoincrement, content text, time text)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS notepad");
onCreate(db);
}
public void insertNotepad(SQLiteDatabase db, String content, String time) {
String sql = "insert into notepad (content, time) values (?, ?)";
db.execSQL(sql, new Object[]{content, time});
}
public Cursor getNotepad(SQLiteDatabase db, int id) {
return db.rawQuery("select * from notepad where id = ?", new String[]{String.valueOf(id)});
}
}
通過(guò)這個(gè)簡(jiǎn)單的示例,你可以掌握在 Android 應(yīng)用中如何使用 SQLite 來(lái)執(zhí)行數(shù)據(jù)庫(kù)操作。你可以進(jìn)一步擴(kuò)展這些代碼來(lái)實(shí)現(xiàn)更多功能,比如更新和刪除記錄、復(fù)雜查詢(xún)等。
7. 小結(jié)
SQLite 是 Android 中非常強(qiáng)大且輕量的內(nèi)置數(shù)據(jù)庫(kù)引擎,適合處理小型的持久化數(shù)據(jù)。通過(guò)本文的代碼示例,你可以快速上手并在實(shí)際項(xiàng)目中使用 SQLite 來(lái)管理和操作數(shù)據(jù)。在實(shí)際開(kāi)發(fā)中,務(wù)必采用參數(shù)化查詢(xún)等安全手段來(lái)防止 SQL 注入攻擊,確保數(shù)據(jù)的安全性。
如果你有更復(fù)雜的需求,例如需要處理大量數(shù)據(jù)、關(guān)系復(fù)雜的數(shù)據(jù)操作,可能需要考慮其他數(shù)據(jù)庫(kù)解決方案,如使用 Room 或者將數(shù)據(jù)存儲(chǔ)到云端。希望本文能夠幫助你更好地理解 SQLite 在 Android 中的使用,提升開(kāi)發(fā)效率和數(shù)據(jù)管理能力。
到此這篇關(guān)于在Android中使用SQLite數(shù)據(jù)庫(kù)及其操作詳解的文章就介紹到這了,更多相關(guān)Android中使用SQLite內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android Toast實(shí)現(xiàn)全屏顯示
這篇文章主要為大家詳細(xì)介紹了Android Toast實(shí)現(xiàn)全屏顯示,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
android RadioButton和CheckBox組件的使用方法
本次實(shí)驗(yàn)中主要是學(xué)習(xí)如何使用RadioGroup,CheckBox,RadioButton和Toast這幾個(gè)控件,android UI開(kāi)發(fā)中也會(huì)經(jīng)常用到他們2013-11-11
Android Intent傳遞數(shù)據(jù)大小限制詳解
這篇文章主要給大家介紹了關(guān)于Android Intent傳遞數(shù)據(jù)大小限制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Android 文件存儲(chǔ)及常見(jiàn)問(wèn)題解決
這篇文章主要介紹了Android 文件存儲(chǔ)及常見(jiàn)問(wèn)題解決的相關(guān)資料,需要的朋友可以參考下2017-02-02
Android使用MediaRecorder實(shí)現(xiàn)錄音及播放
這篇文章主要為大家詳細(xì)介紹了Android使用MediaRecorder實(shí)現(xiàn)錄音及播放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
Fultter NestedScrollView實(shí)現(xiàn)吸頂效果以及遇到問(wèn)題解析
這篇文章主要為大家介紹了Fultter NestedScrollView實(shí)現(xiàn)吸頂效果以及遇到問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
利用Fiddler對(duì)手機(jī)進(jìn)行抓包的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇利用Fiddler對(duì)手機(jī)進(jìn)行抓包的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
Android自定義實(shí)現(xiàn)一個(gè)省份簡(jiǎn)稱(chēng)鍵盤(pán)
這篇文章主要為大家詳細(xì)介紹了Android如何自定義實(shí)現(xiàn)一個(gè)省份簡(jiǎn)稱(chēng)鍵盤(pán),可以用在車(chē)牌輸入等地方,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06
Android學(xué)習(xí)教程之圓形Menu菜單制作方法(1)
這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)教程之圓形Menu菜單操作代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11

