實(shí)例講解Android App使用自帶的SQLite數(shù)據(jù)庫(kù)的基本方法
SQLite數(shù)據(jù)庫(kù)是android系統(tǒng)內(nèi)嵌的數(shù)據(jù)庫(kù),小巧強(qiáng)大,能夠滿(mǎn)足大多數(shù)SQL語(yǔ)句的處理工作,而SQLite數(shù)據(jù)庫(kù)僅僅是個(gè)文件而已。雖然SQLite的有點(diǎn)很多,但并不是如同PC端的mysql般強(qiáng)大,而且android系統(tǒng)中不允許通過(guò)JDBC操作遠(yuǎn)程數(shù)據(jù)庫(kù),所以只能通過(guò)webservice等手段于php、servlet交互獲取數(shù)據(jù)。
基礎(chǔ)
SQLiteDatabase類(lèi),代表了一個(gè)數(shù)據(jù)庫(kù)對(duì)象,通過(guò)SQLiteDatabase來(lái)操作管理數(shù)據(jù)庫(kù)。
一些基本的用法:
- static SQLiteDatabase openDatabase(String path,SQLiteDatabase.CUrsorFactory factory,int flag);
- static SQLiteDatabase openOrCreateDatabase(File file,SQLiteDatabase.CursorFactory factory);
- static SQLiteDatabase openOrCreateDatabase(String path,SQLiteDatabse.CursorFactory factory);
通過(guò)這些靜態(tài)方法可以很方便的打開(kāi)和新建一個(gè)數(shù)據(jù)庫(kù)。
- execSQL(String sql,Object[] bindArgs)
- execSQL(String sql)
- rawQuery(String sql,String[] selectionArgs);
- beginTransaction()
- endTransaction()
這些函數(shù)可以完成SQL功能,對(duì)于查詢(xún)出來(lái)的結(jié)果是用Cursor表示的,類(lèi)似于JDBC中的ResultSet類(lèi),在這些類(lèi)中通過(guò)方法move(int offset)、moveToFirst()、moveToLast()、moveToNext()、moveToPosition(int position)、moveToPrivious()獲取需要的結(jié)果行。
下面通過(guò)一個(gè)實(shí)例來(lái)說(shuō)明一下SQLiteDatabase的基本使用:
main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".Main" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="key" />
<EditText
android:id="@+id/keys"
android:layout_width="100sp"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="value" />
<EditText
android:id="@+id/values"
android:layout_width="100sp"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn"
android:layout_width="100sp"
android:layout_height="wrap_content"
android:text="submit" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
用于填充數(shù)據(jù)的mytextview.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/listkey"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left" />
<TextView
android:id="@+id/listvalue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="300sp" />
</LinearLayout>
Main.java
package com.app.main;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CursorAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class Main extends Activity {
EditText ed1 = null;
EditText ed2 = null;
Button btn = null;
ListView lv = null;
SQLiteDatabase db = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ed1 = (EditText) this.findViewById(R.id.keys);
ed2 = (EditText) this.findViewById(R.id.values);
btn = (Button) this.findViewById(R.id.btn);
lv = (ListView) this.findViewById(R.id.lv);
db = SQLiteDatabase.openOrCreateDatabase(this.getFilesDir().toString()
+ "/my.db3", null);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
String key = ed1.getText().toString();
String value = ed2.getText().toString();
try {
insertData(db, key, value);
Cursor cursor = db.rawQuery("select * from tb_info", null);
inflateListView(cursor);
} catch (Exception e) {
String sql = "create table tb_info(_id integer primary key autoincrement,db_key varchar(20),db_value varchar(50))";
db.execSQL(sql);
insertData(db, key, value);
Cursor cursor = db.rawQuery("select * from tb_info", null);
inflateListView(cursor);
}
}
});
}
// 向數(shù)據(jù)庫(kù)中插入數(shù)據(jù)
private void insertData(SQLiteDatabase db, String key, String value) {
db.execSQL("insert into tb_info values (null,?,?)", new String[] { key,
value });
System.out.println("------------------");
}
// 向ListView中填充數(shù)據(jù)
@SuppressLint("NewApi")
public void inflateListView(Cursor cursor) {
SimpleCursorAdapter adapter = new SimpleCursorAdapter(Main.this,
R.layout.mytextview, cursor, new String[] { "db_key",
"db_value" },
new int[] { R.id.listkey, R.id.listvalue },
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
lv.setAdapter(adapter);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (db != null && db.isOpen()) {
db.close();
}
}
}
實(shí)現(xiàn)的效果:

需要特別指出,在用SimpleCursorAdapter封裝Cursor的時(shí)候,要求底層數(shù)據(jù)庫(kù)表的主鍵列的列名為_(kāi)id,因?yàn)镾impleCursorAdapter只能識(shí)別主鍵列名為_(kāi)id的表。
進(jìn)階
直接使用SQLiteDatabase的openOrCreateDatabase可以直接打開(kāi)或者是新建一個(gè)SQLiteDatabase,但是這里存在一個(gè)缺點(diǎn)。在每次執(zhí)行SQL語(yǔ)句的時(shí)候都需要在try catch語(yǔ)句中進(jìn)行,如果在try中直接操作的數(shù)據(jù)庫(kù)或者表不存在,就需要在catch中重新創(chuàng)建表并且執(zhí)行CRUD操作,并且有關(guān)數(shù)據(jù)庫(kù)的每一個(gè)方法都要這么做,重復(fù)的代碼太多了,所以實(shí)際的開(kāi)發(fā)中大都選用SQLiteOpenHelper類(lèi)。
主要方法:
- synchronized SQLiteDatabase getReadableDatabase():以讀寫(xiě)的方式打開(kāi)數(shù)據(jù)庫(kù)。
- synchronized SQLiteDatabase getWritableDatabase();以寫(xiě)的方式打開(kāi)數(shù)據(jù)庫(kù)。
- abstract void onCreate(SQLiteDatabase db) 當(dāng)?shù)谝淮蝿?chuàng)建數(shù)據(jù)庫(kù)的時(shí)候回調(diào)該方法。
- abstract void onUprade(SQLiteDatabase db,int oldversion,int newVersion) 數(shù)據(jù)庫(kù)版本更新的時(shí)候回調(diào)該方法。
- abstract void close() 關(guān)閉所有打開(kāi)的SQLiteDatabase.
使用方法:
1)繼承SQLiteOpenHelper。在構(gòu)造方法中的參數(shù)String name就是數(shù)據(jù)庫(kù)的名稱(chēng)。
2)重寫(xiě)onCreate和onUpgrade方法。
MySQLiteOpenHelper類(lèi):
package com.app.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
String createSQL = "create table tb_test(_id integer primary key autoincrement ,name,age )";
public MySQLiteOpenHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(createSQL);
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
}
}
Main.java
package com.app.main;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.Menu;
import android.widget.Toast;
import com.app.db.MySQLiteOpenHelper;
public class Main extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MySQLiteOpenHelper helper = new MySQLiteOpenHelper(this, "my.db3",
null, 1);
String insertSQL = "insert into tb_test values(null,'wx',18)";
SQLiteDatabase db = helper.getReadableDatabase();
db.execSQL(insertSQL);
Cursor cursor = db.rawQuery("select * from tb_test", null);
cursor.moveToFirst();
int id = cursor.getInt(0);
Toast.makeText(this, id+"",Toast.LENGTH_SHORT).show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
實(shí)現(xiàn)效果:

- android studio使用SQLiteOpenHelper()建立數(shù)據(jù)庫(kù)的方法
- Android Studio 通過(guò)登錄功能介紹SQLite數(shù)據(jù)庫(kù)的使用流程
- Android使用SQLite數(shù)據(jù)庫(kù)的示例
- Android創(chuàng)建和使用數(shù)據(jù)庫(kù)SQLIte
- Android App使用SQLite數(shù)據(jù)庫(kù)的一些要點(diǎn)總結(jié)
- Android中使用SQLite3 命令行查看內(nèi)嵌數(shù)據(jù)庫(kù)的方法
- Android使用SQLite數(shù)據(jù)庫(kù)的簡(jiǎn)單實(shí)例
- Android SQLite數(shù)據(jù)庫(kù)增刪改查操作的使用詳解
- SQLite數(shù)據(jù)庫(kù)在A(yíng)ndroid中的使用小結(jié)
相關(guān)文章
Android基于A(yíng)dapterViewFlipper實(shí)現(xiàn)的圖片/文字輪播動(dòng)畫(huà)控件
這篇文章主要介紹了Android基于A(yíng)dapterViewFlipper實(shí)現(xiàn)的圖片/文字輪播動(dòng)畫(huà)控件,幫助大家更好的理解和學(xué)習(xí)使用Android開(kāi)發(fā),感興趣的朋友可以了解下2021-04-04
Android?Flutter實(shí)現(xiàn)創(chuàng)意時(shí)鐘的示例代碼
時(shí)鐘這個(gè)東西很奇妙,總能當(dāng)做創(chuàng)意實(shí)現(xiàn)的入口。這篇文章主要介紹了如何通過(guò)Android?Flutter實(shí)現(xiàn)一個(gè)創(chuàng)意時(shí)鐘,感興趣的小伙伴可以了解一下2023-03-03
android實(shí)現(xiàn)可拖動(dòng)的浮動(dòng)view
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)可拖動(dòng)的浮動(dòng)view,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
Android應(yīng)用開(kāi)發(fā)中模擬按下HOME鍵的效果(實(shí)現(xiàn)代碼)
Android應(yīng)用開(kāi)發(fā)中, 有一種場(chǎng)景,就是我們不希望用戶(hù)直接按Back鍵退出Activity,而是希望應(yīng)用隱藏到后臺(tái),類(lèi)似于按Home鍵的效果2013-05-05
Flutter 實(shí)現(xiàn)虎牙/斗魚(yú) 彈幕功能
這篇文章主要介紹了Flutter 實(shí)現(xiàn)虎牙/斗魚(yú) 彈幕功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04

