實(shí)例講解Android App使用自帶的SQLite數(shù)據(jù)庫的基本方法
SQLite數(shù)據(jù)庫是android系統(tǒng)內(nèi)嵌的數(shù)據(jù)庫,小巧強(qiáng)大,能夠滿足大多數(shù)SQL語句的處理工作,而SQLite數(shù)據(jù)庫僅僅是個(gè)文件而已。雖然SQLite的有點(diǎn)很多,但并不是如同PC端的mysql般強(qiáng)大,而且android系統(tǒng)中不允許通過JDBC操作遠(yuǎn)程數(shù)據(jù)庫,所以只能通過webservice等手段于php、servlet交互獲取數(shù)據(jù)。
基礎(chǔ)
SQLiteDatabase類,代表了一個(gè)數(shù)據(jù)庫對(duì)象,通過SQLiteDatabase來操作管理數(shù)據(jù)庫。
一些基本的用法:
- 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);
通過這些靜態(tài)方法可以很方便的打開和新建一個(gè)數(shù)據(jù)庫。
- execSQL(String sql,Object[] bindArgs)
- execSQL(String sql)
- rawQuery(String sql,String[] selectionArgs);
- beginTransaction()
- endTransaction()
這些函數(shù)可以完成SQL功能,對(duì)于查詢出來的結(jié)果是用Cursor表示的,類似于JDBC中的ResultSet類,在這些類中通過方法move(int offset)、moveToFirst()、moveToLast()、moveToNext()、moveToPosition(int position)、moveToPrivious()獲取需要的結(jié)果行。
下面通過一個(gè)實(shí)例來說明一下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ù)庫中插入數(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ù)庫表的主鍵列的列名為_id,因?yàn)镾impleCursorAdapter只能識(shí)別主鍵列名為_id的表。
進(jìn)階
直接使用SQLiteDatabase的openOrCreateDatabase可以直接打開或者是新建一個(gè)SQLiteDatabase,但是這里存在一個(gè)缺點(diǎn)。在每次執(zhí)行SQL語句的時(shí)候都需要在try catch語句中進(jìn)行,如果在try中直接操作的數(shù)據(jù)庫或者表不存在,就需要在catch中重新創(chuàng)建表并且執(zhí)行CRUD操作,并且有關(guān)數(shù)據(jù)庫的每一個(gè)方法都要這么做,重復(fù)的代碼太多了,所以實(shí)際的開發(fā)中大都選用SQLiteOpenHelper類。
主要方法:
- synchronized SQLiteDatabase getReadableDatabase():以讀寫的方式打開數(shù)據(jù)庫。
- synchronized SQLiteDatabase getWritableDatabase();以寫的方式打開數(shù)據(jù)庫。
- abstract void onCreate(SQLiteDatabase db) 當(dāng)?shù)谝淮蝿?chuàng)建數(shù)據(jù)庫的時(shí)候回調(diào)該方法。
- abstract void onUprade(SQLiteDatabase db,int oldversion,int newVersion) 數(shù)據(jù)庫版本更新的時(shí)候回調(diào)該方法。
- abstract void close() 關(guān)閉所有打開的SQLiteDatabase.
使用方法:
1)繼承SQLiteOpenHelper。在構(gòu)造方法中的參數(shù)String name就是數(shù)據(jù)庫的名稱。
2)重寫onCreate和onUpgrade方法。
MySQLiteOpenHelper類:
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ù)庫的方法
- Android Studio 通過登錄功能介紹SQLite數(shù)據(jù)庫的使用流程
- Android使用SQLite數(shù)據(jù)庫的示例
- Android創(chuàng)建和使用數(shù)據(jù)庫SQLIte
- Android App使用SQLite數(shù)據(jù)庫的一些要點(diǎn)總結(jié)
- Android中使用SQLite3 命令行查看內(nèi)嵌數(shù)據(jù)庫的方法
- Android使用SQLite數(shù)據(jù)庫的簡單實(shí)例
- Android SQLite數(shù)據(jù)庫增刪改查操作的使用詳解
- SQLite數(shù)據(jù)庫在Android中的使用小結(jié)
相關(guān)文章
Android中日期與時(shí)間設(shè)置控件用法實(shí)例
這篇文章主要介紹了Android中日期與時(shí)間設(shè)置控件用法,實(shí)例分析了Android日期與時(shí)間相關(guān)控件的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
Android開發(fā)實(shí)現(xiàn)的保存圖片到相冊(cè)功能示例
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)的保存圖片到相冊(cè)功能,結(jié)合實(shí)例形式分析了Android圖片命名、保存、權(quán)限控制等相關(guān)操作技巧,需要的朋友可以參考下2019-03-03
Android開發(fā)導(dǎo)入項(xiàng)目報(bào)錯(cuò)Ignoring InnerClasses attribute for an anonym
今天小編就為大家分享一篇關(guān)于Android開發(fā)導(dǎo)入項(xiàng)目報(bào)錯(cuò)Ignoring InnerClasses attribute for an anonymous inner class的解決辦法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12
Android實(shí)現(xiàn)Neumorphism?UI控件
大家好,本篇文章主要講的是Android實(shí)現(xiàn)Neumorphism?UI控件,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02
Android自定義View設(shè)定到FrameLayout布局中實(shí)現(xiàn)多組件顯示的方法 分享
Android自定義View設(shè)定到FrameLayout布局中實(shí)現(xiàn)多組件顯示的方法 分享,需要的朋友可以參考一下2013-05-05
Flutter開發(fā)之對(duì)角棋游戲?qū)崿F(xiàn)實(shí)例詳解
這篇文章主要為大家介紹了Flutter開發(fā)之對(duì)角棋游戲?qū)崿F(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Android基于OpenCV實(shí)現(xiàn)QR二維碼檢測(cè)
QR碼比普通一維條碼具有快速讀取和更大的存儲(chǔ)資料容量,也無需要像一維條碼般在掃描時(shí)需要直線對(duì)準(zhǔn)掃描儀。因此其應(yīng)用范圍已經(jīng)擴(kuò)展到包括產(chǎn)品跟蹤,物品識(shí)別,文檔管理,庫存營銷等方面。本文講解Android基于OpenCV實(shí)現(xiàn)QR二維碼檢測(cè)的步驟2021-06-06

