Android之SqliteDatabase數據庫學習筆記
1.SqliteDatabase概述:
大家對sqlite數據庫應該是比較瞭解的,他是一個輕量級的數據庫,並且他只是一個嵌入式的數據庫引擎,專門適合於資源有限的設備(如手機、PAD等)上存儲適量的數據。那麼android爲我們提供了SqliteDatabase代表一個數據庫(底層就是一個數據庫文件),只要獲取到這個對象,我們就可以對數據庫進行操作和管理了。
2.先看看SqliteDatabase爲我們提供瞭如下打開靜態方法來打開一個文件對應的數據庫:
static SQLiteDatabase openDatabase(String path,SQLiteDatabase.CursorFactoryFactory,int flags) 打開path路徑文件所代表的Sqlite數據庫
static SQLiteDatabase openOrCreateDatabase(File file,SQLiteDatabase.CursorFactoryFactory) 打開或創建(如果不存在)file文件所代表的數據庫。
static SQLiteDatabase openOrCreateDatabase(String path,SQLiteDatabase.CursorFactoryFactory,int flags) 打開或創建(如果不存在)path路徑所代表的數據庫。
3.通過上面的靜態方法就可以獲取SQLiteDatabase實例了,在有了這個對象後,我們就可以通過如下的方法來操作數據庫了
execSQL(String sql, Object[] bindArgs):執行帶佔位符的SQL語句
sql:代表要執行的sql語句 例如查詢語句:select * from student where age = ?
bindArgs:佔位符的值,如上語句中age = ? 假如我們需要查詢年級爲20歲的,則我們可以寫上
這個參數即可: new Object[]{10}
execSQL(String sql):執行SQL語句
insert(String table, String nullColumnHack, ContentValues values):
向指定的表中插入數據
table:表名
nullColumnHack:如果後面的values參數爲null或者不包含任何key-value對時這該參數
有效,表示強行插入該數值
values:一行的記錄值
update(String table, ContentValues values, String whereClause, String[] whereArgs):更新指定表中的特定數據
table:表名
values:想更新的值
whereClause:滿足該參數子句的記錄將會被更新
whereArgs:用於爲子句的佔位符傳入參數
delete(String table, String whereClause, String[] whereArgs):刪除指定表中的特定數據
table:表名
whereClause:滿足該參數子句的記錄將會被刪除
whereArgs:用於爲子句的佔位符傳入參數
query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy):對指定的數據表進行查詢
table:表名
colnums:要查詢出來的列名,相當於select語句select關鍵字後面的部分
selection:查詢條件子句,相當於select語句where關鍵字後面的部分,
該子句中允許佔位符?
seletctionArgs:查詢子句selection的佔位符的參數
gropBy:用於控制分組,相當於select語句group by關鍵字後面的部分
having:用於對分組進行過濾。相當於select語句having關鍵字後面的部分
orderBy:用於對記錄進行排序,相當於select語句order by關鍵字後面的部分,
如name desc 、age
asc。 desc(表示降序,從大到小)asc(表示升序,從小到大)
query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit):對指定的數據表執行查詢,limit參數控制最多查詢幾條記錄(用於控制分頁的參數)
limit:用於進行分頁。相當於select語句limit關鍵字後面的部分,如 2,5(表示從第3條數據開始
查詢,查詢5條數據)
query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit):對指定的數據表執行查詢。其中第一個參數控制是否除去重複值
distinct:指定是否去除重複的記錄
rawQuery(String sql, String[] selectionArgs):執行帶佔位符的SQL語句。
sql:sql語句
selectionArgs:佔位符的參數
beginTransaction():開始事務
endTransaction():結束事務
4.如何創建數據庫和表
//創建數據庫,如果該文件下不存在數據庫就創建,存在就打開,
//getFilesDir()獲取的路徑是:/data/data/對應你的包名(com.itrealman.sqlitedatabase)/files
SqliteDatabase db = SQLiteDatabase.openOrCreateDatabase(getFilesDir() + “/” + DBNAME,null);
//創建person表
db.execSQL(“create table person(_id integer primary key autoincrement, perName varchar(20) not null,perAge int check(perAge >= 0 and perAge <= 150))”);
5.下面通過使用SQL語句來操作Sqlite數據庫
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context="com.itrealman.contentprovide.MainActivity">
<TextView
android:id="@+id/mTvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="請輸入姓名:"
android:textSize="20sp" />
<EditText
android:id="@+id/mEdtName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/mTvName"
android:layout_marginTop="10dp" />
<TextView
android:id="@+id/mTvAge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/mEdtName"
android:layout_marginTop="20dp"
android:text="請輸入年齡:"
android:textSize="20sp" />
<EditText
android:id="@+id/mEdtAge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/mTvAge"
android:layout_marginTop="10dp" />
<LinearLayout
android:id="@+id/mLin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/mEdtAge"
android:layout_marginTop="10dp"
android:gravity="center">
<Button
android:id="@+id/mBtnCreate"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="創建表" />
<Button
android:id="@+id/mBtnInsert"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="插入" />
<Button
android:id="@+id/mBtnDelete"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="刪除" />
<Button
android:id="@+id/mBtnUpdate"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="更新" />
<Button
android:id="@+id/mBtnQuery"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="查詢" />
</LinearLayout>
<TextView
android:id="@+id/mTvResult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/mLin"
android:layout_marginTop="50dp"
android:text="查詢的數據爲:"
android:textSize="20sp" />
</RelativeLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//數據庫對象
private SQLiteDatabase db;
//數據庫名
public final String DBNAME = "test.db";
//數據庫表名
public final String TABLENAME = "person";
private EditText mEdtName;
private EditText mEdtAge;
private TextView mTvResult;
private Button mBtnInsert;
private Button mBtnDelete;
private Button mBtnUpdate;
private Button mBtnQuery;
private Button mBtnCreate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
event();
//創建person表
}
/**
* 初始化事件
*/
private void event() {
mBtnDelete.setOnClickListener(this);
mBtnInsert.setOnClickListener(this);
mBtnUpdate.setOnClickListener(this);
mBtnQuery.setOnClickListener(this);
mBtnCreate.setOnClickListener(this);
}
/**
* 初始化控件
*/
private void init() {
//創建數據庫,如果該文件下不存在數據庫就創建,存在就打開,
//getFilesDir()獲取的路徑是:/data/data/對應你的包名(com.itrealman.sqlitedatabase)/files
db = SQLiteDatabase.openOrCreateDatabase(getFilesDir() + "/" + DBNAME, null);
mBtnInsert = (Button) findViewById(R.id.mBtnInsert);
mBtnDelete = (Button) findViewById(R.id.mBtnDelete);
mBtnUpdate = (Button) findViewById(R.id.mBtnUpdate);
mBtnQuery = (Button) findViewById(R.id.mBtnQuery);
mBtnCreate = (Button)findViewById(R.id.mBtnCreate);
mEdtAge = (EditText) findViewById(R.id.mEdtAge);
mEdtName = (EditText) findViewById(R.id.mEdtName);
mTvResult = (TextView)findViewById(R.id.mTvResult);
}
@Override
public void onClick(View v) {
String name = null;
int age = 0;
switch (v.getId()) {
case R.id.mBtnDelete:
name = mEdtName.getText().toString().trim();
deleteData(name);
break;
case R.id.mBtnUpdate:
name = mEdtName.getText().toString().trim();
age = Integer.parseInt(mEdtAge.getText().toString().trim());
updateData("newName", age, name);
break;
case R.id.mBtnInsert:
name = mEdtName.getText().toString().trim();
age = Integer.parseInt(mEdtAge.getText().toString().trim());
insertData(name, age);
break;
case R.id.mBtnQuery:
queryAllData();
break;
case R.id.mBtnCreate:
createTable();
break;
}
}
/**
* 插入數據
* @param name
* @param age
*/
private void insertData(String name, int age) {
db.execSQL("insert into " + TABLENAME + "(name,age) values(?,?)", new Object[]{name, age});
Toast.makeText(this, "插入數據", Toast.LENGTH_SHORT).show();
}
/**
* 刪除數據
* @param name
*/
private void deleteData(String name) {
db.execSQL("delete from " + TABLENAME + " where name = ?", new Object[]{name});
Toast.makeText(this, "刪除數據", Toast.LENGTH_SHORT).show();
}
/**
* 更新數據
* @param name 更新數據的名字
* @param age 更新數據年齡
* @param name1 需要跟新的條件
*/
private void updateData(String name, int age, String name1) {
db.execSQL("update " + TABLENAME + " set name = ? ,age = ? where name = ?", new Object[]{name, age, name1});
Toast.makeText(this, "更新數據", Toast.LENGTH_SHORT).show();
}
/**
* 查詢所有數據
*/
private void queryAllData() {
Cursor cursor = db.rawQuery("select * from " + TABLENAME,null);
StringBuilder sb = new StringBuilder();
sb.append("查詢的數據爲:");
while (cursor.moveToNext()) {
sb.append("name = " + cursor.getString(cursor.getColumnIndex("name"))).append(" age = " + cursor.getInt(cursor.getColumnIndex("age"))).append(" ");
}
mTvResult.setText(sb.toString());
}
/**
* 創建表,如果表存在就不創建,這也是一個小細節,如果說不加if not exists語句,那麼
* 這個表就只能創建一次,後面的每次創建都會導致程序崩潰,加上這條語句後,起碼創建
* 表按鈕不會導致程序崩潰
*/
private void createTable(){
db.execSQL("create table if not exists " + TABLENAME + "(_id integer primary key autoincrement, name varchar(20) not null,age int check(age >= 0 and age <= 150))");
Toast.makeText(this,"創建表",Toast.LENGTH_SHORT).show();
}
/**
* 每次結束程序時關閉數據庫,防止內存泄露問題
*/
@Override
protected void onDestroy() {
super.onDestroy();
if(db != null){
db.close();
}
}
}
上面的代碼都是採用都是使用SQL語句的形式對數據庫操作的,也許對於初學者來說會覺得這些SQL語句寫起來非常繁瑣,一不小心SQL語句就寫錯了,但是作爲一個程序員,這些基本的語句還是要掌握的。當然我們還有更方便的方法來對數據庫進行操作,爲了防止SQL語句一不留神就寫錯了,安卓直接爲我們提供針對表名的形式進行增刪改查操作,而通過這些方法,我們只需要傳遞對應的表名、查詢條件、值、參數等。
注意,初次啓動必須點擊一次創建表按鈕,或者爲了方便起見,可以把創建表語句放到onCreate方法中,每次初始化時讓其自動創建表即可。
配上效果圖吧,只做了簡單的操作 ,其他操作都一樣,只是沒做這些效果:
ps:對應上面的代碼,是讓初學者掌握基本的SqliteDatabase的操作,平時在安卓中都不會使用這些代碼做基本操作,有關SqliteDatabase數據庫的封裝操作會在後面學習中講解。