SQLite是輕量級的數據庫,是遵循ACID(原子性、一致性、隔離性、持久性)的關聯式數據庫管理系統,多用於嵌入式開發,值得注意的是 integer primary key只能存儲64位整數。
在Android中,提供了一個SQLiteOpenHelper的抽象類(此類已經加載驅動,實現了 連接數據庫.),該類用於數據庫版本進行管理,常用方法有:
onCreate 數據庫創建時執行(第一次連接獲取數據庫對象時執行)
onUpgrade 數據庫更新時執行(版本號改變時執行)
onOpen 數據庫每次打開時執行(打開數據庫時調用,在前兩個方法之後)
第1步:創建一個PersonSQLiteOpenHelper繼承SQLiteOpenHelper,數據庫幫助類,用於創建和管理數據庫的
package com.example.zhansy.myapplication.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by ZHANSY on 2015/8/18.
* 數據庫幫助類,用於創建和管理數據庫的
*/
public class PersonSQLiteOpenHelper extends SQLiteOpenHelper{
/**
* 數據庫的構造函數
* @param context
* name 數據庫名稱
* factory 遊標工程
* version 數據庫的版本號 不可以小於1
*/
public PersonSQLiteOpenHelper(Context context) {
super(context, "zhansy.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//操作數據庫
String sql = "create table person(_id integer primary key, name varchar(20),age integer)";
sqLiteDatabase.execSQL(sql);//創建person表
}
/**
* 數據庫的版本號更新時回調此方法,
* 更新數據庫的內容(刪除表, 添加表, 修改表)
* @param sqLiteDatabase
* @param i 舊版本號
* @param i1 新版本號
*/
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
if(i == 1 && i1 == 2) {
//數據庫更新啦,在person表中添加一個餘額列balance
sqLiteDatabase.execSQL("alter table person add balance integer;");
}
}
}
第2步:創建一個person實體類,便於操作數據庫的增刪改查
package com.example.zhansy.myapplication.bean;
/**
* Created by ZHANSY on 2015/8/18.
* 實體類Person
*/
public class Person {
private int id;
private String name;
private int age;
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public Person() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
第3步:對“人”的表的數據庫進行增刪改查的操作
獲得數據庫的讀寫對象,判斷數據庫是否打開,執行增刪改查操作,最後一定要關閉數據庫
package com.example.zhansy.myapplication.dao;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.example.zhansy.myapplication.bean.Person;
import com.example.zhansy.myapplication.db.PersonSQLiteOpenHelper;
import java.util.ArrayList;
import java.util.List;
/**
* Created by ZHANSY on 2015/8/18.
*/
public class PersonDao {
private PersonSQLiteOpenHelper mOpenHelper;//數據庫幫助類
public PersonDao(Context context) {
mOpenHelper = new PersonSQLiteOpenHelper(context);
}
/**
* 添加person表一條數據
* @param person
*/
public void insert(Person person) {
//執行這一步時,數據庫對象才被真正創建
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if (db.isOpen()) {
//如果數據庫打開,則執行添加數據操作
db.execSQL("insert into person(name,age) values(?,?);", new Object[]{person.getName(), person.getAge()});
db.close();//關閉數據庫
}
}
/**
* 根據ID刪除記錄
*
* @param id
*/
public void delete(int id) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if (db.isOpen()) {
//如果數據庫打開,則執行添加數據操作
db.execSQL("delete from person where _id = ?", new Integer[]{id});
db.close();//關閉數據庫
}
}
/**
* 根據id找到記錄,並且修改姓名
*
* @param id
* @param name
*/
public void update(int id, String name) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if (db.isOpen()) {
//如果數據庫打開,則執行添加數據操作
db.execSQL("update person set name = ? where _id = ?;", new Object[]{name, id});
db.close();//關閉數據庫
}
}
/**
* 取數據庫中的所有人
* @return 全部人的信息person
*/
public List<Person> queryAll() {
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
if (db.isOpen()) {
//默認cursor值爲-1
Cursor cursor = db.rawQuery("select _id,name,age from person;", null);//等價於select * from person
if (cursor !=null && cursor.getCount()>0) {
List<Person> personsList = new ArrayList<Person>();
int id;
String name;
int age;
while (cursor.moveToNext()) {
id = cursor.getInt(0);//取第0列的數據 id
name = cursor.getString(1);//取姓名
age = cursor.getInt(2);//取年齡
personsList.add(new Person(id, name, age));
}
db.close();
return personsList;
}
db.close();
}
return null;
}
/**
* 根據id查詢人
* @param id
* @return
*/
public Person queryItem(int id){
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
if(db.isOpen()) {
Cursor cursor = db.rawQuery("select _id,name,age from person where _id = ?", new String[]{id + ""});
if(cursor != null && cursor.moveToFirst()) {
int _id = cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(2);
db.close();
return new Person(_id, name, age);
}
db.close();
}
return null;
}
}
用SQLite自帶的API進行增刪改查:
/**
* 添加到person表一條數據
* @param person
*/
public void insert(Person person) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if(db.isOpen()) { // 如果數據庫打開, 執行添加的操作
ContentValues values = new ContentValues();
values.put("name", person.getName()); // key作爲要存儲的列名, value對象列的值
values.put("age", person.getAge());
long id = db.insert("person", "name", values);
Log.i(TAG, "id: " + id);
db.close(); // 數據庫關閉
}
}
/**
* 更據id刪除記錄
* @param id
*/
public void delete(int id) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase(); // 獲得可寫的數據庫對象
if(db.isOpen()) { // 如果數據庫打開, 執行添加的操作
String whereClause = "_id = ?";
String[] whereArgs = {id + ""};
int count = db.delete("person", whereClause, whereArgs);
Log.i(TAG, "刪除了: " + count + "行");
db.close(); // 數據庫關閉
}
}
/**
* 根據id找到記錄, 並且修改姓名
* @param id
* @param name
*/
public void update(int id, String name) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if(db.isOpen()) { // 如果數據庫打開, 執行添加的操作
ContentValues values = new ContentValues();
values.put("name", name);
int count = db.update("person", values, "_id = ?", new String[]{id + ""});
Log.i(TAG, "修改了: " + count + "行");
db.close(); // 數據庫關閉
}
}
public List<Person> queryAll() {
SQLiteDatabase db = mOpenHelper.getReadableDatabase(); // 獲得一個只讀的數據庫對象
if(db.isOpen()) {
String[] columns = {"_id", "name", "age"}; // 需要的列
String selection = null; // 選擇條件, 給null查詢所有
String[] selectionArgs = null; // 選擇條件的參數, 會把選擇條件中的? 替換成數據中的值
String groupBy = null; // 分組語句 group by name
String having = null; // 過濾語句
String orderBy = null; // 排序
Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy);
int id;
String name;
int age;
if(cursor != null && cursor.getCount() > 0) {
List<Person> personList = new ArrayList<Person>();
while(cursor.moveToNext()) { // 向下移一位, 知道最後一位, 不可以往下移動了, 停止.
id = cursor.getInt(0);
name = cursor.getString(1);
age = cursor.getInt(2);
personList.add(new Person(id, name, age));
}
db.close();
return personList;
}
db.close();
}
return null;
}
/**
* 根據id查詢人
* @param id
* @return
*/
public Person queryItem(int id) {
SQLiteDatabase db = mOpenHelper.getReadableDatabase(); // 獲得一個只讀的數據庫對象
if(db.isOpen()) {
String[] columns = {"_id", "name", "age"}; // 需要的列
String selection = "_id = ?"; // 選擇條件, 給null查詢所有
String[] selectionArgs = {id + ""}; // 選擇條件的參數, 會把選擇條件中的? 替換成數據中的值
String groupBy = null; // 分組語句 group by name
String having = null; // 過濾語句
String orderBy = null; // 排序
Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy);
if(cursor != null && cursor.moveToFirst()) { // cursor對象不爲null, 並且可以移動到第一行
int _id = cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(2);
db.close();
return new Person(_id, name, age);
}
db.close();
}
return null;
}
最後就是在main函數中,要進行哪個操作就調用哪個的方法。
總結的語句爲:
創建表:
create table person(
_id integer primary key autoincrement,
name varchar(20),
age integer
);
添加: insert into person(name, age) values('lisi', 19);
刪除: delete from person where _id = 1;
修改: update person set name = '李四' where name = '王五';
查詢所有: select * from person;
查詢單條: select * from person where name = 'zhangsan';
事務的作用是:標記需要運行的操作代碼,全部成功執行纔算成功,否則回滾到開啓事務之前。
事務:
update person set balance = balance - 100 where name = 'lisi';
update person set balance = balance + 100 where name = 'zhangsan';
// 開啓事務
db.beginTransaction();
// 標記事務成功
db.setTransactionSuccessful();
// 停止事務
db.endTransaction();