前言
今天主要講講sqlite在android中的創(chuàng)建,存儲(chǔ) 和 sqlite的增刪改查。
下面以一個(gè)例子做講解
一 創(chuàng)建數(shù)據(jù)庫(kù),需要繼承SQLiteOpenHelper
下面是創(chuàng)建user數(shù)據(jù)庫(kù)的類DBOpenHelper
package com.example.pei.textdemo.sqlite;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Title:創(chuàng)建數(shù)據(jù)庫(kù)
* Description:
* <p>
* Created by pei
* Date: 2017/11/16
*/
public class DBOpenHelper extends SQLiteOpenHelper{
private static final String DB_NAME = "test_demo.db";//數(shù)據(jù)庫(kù)文件名
private static SQLiteDatabase INSTANCE;
private Context mContext;
public SQLiteDatabase getInstance() {
if (INSTANCE == null) {
INSTANCE = new DBOpenHelper(mContext).getWritableDatabase();
}
return INSTANCE;
}
public DBOpenHelper(Context context) {
this(context, DB_NAME, null, 1);
this.mContext=context;
}
public DBOpenHelper(Context context, String dbName, SQLiteDatabase.CursorFactory factory, int version) {
super(context, dbName, factory, version);
}
//首次創(chuàng)建數(shù)據(jù)庫(kù)時(shí)調(diào)用,一般進(jìn)行建庫(kù)建表操作
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE IF NOT EXISTS user(_id integer NOT NULL PRIMARY KEY AUTOINCREMENT,\n" +
" name text,\n" +
" sex text,\n" +
" age integer);";
//創(chuàng)建表
db.execSQL(createTable);
}
//當(dāng)數(shù)據(jù)庫(kù)的版本發(fā)生變化的時(shí)候會(huì)自動(dòng)執(zhí)行,禁止人為調(diào)用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
二 提供一個(gè)數(shù)據(jù)庫(kù)增刪改查的抽象類,主要用來統(tǒng)一管理整個(gè)數(shù)據(jù)庫(kù)涉及到的增刪改查
下面是提供增刪改查抽象類DBHelper
package com.example.pei.textdemo.sqlite;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.example.pei.textdemo.app.AppContext;
import java.util.List;
/**
* Title:數(shù)據(jù)庫(kù)增刪改查幫助類
* Description:
* <p>
* Created by pei
* Date: 2017/11/16
*/
public abstract class DBHelper {
protected DBOpenHelper mDBOpenHelper;
/**獲取數(shù)據(jù)庫(kù)對(duì)象**/
protected SQLiteDatabase getDateBase(){
mDBOpenHelper=new DBOpenHelper(AppContext.getInstance());
return mDBOpenHelper.getInstance();
}
/**關(guān)閉數(shù)據(jù)庫(kù)**/
protected void closeDB(){
SQLiteDatabase db = getDateBase();
if(db!=null){
db.close();
}
}
/**
* 判斷表是否存在
* @param tableName:表名
* @return
*/
protected boolean isTableExist(String tableName){
Cursor cursor = getDateBase().rawQuery("select name from sqlite_master where type='table';", null);
while(cursor.moveToNext()){
//遍歷出表名
String name = cursor.getString(0);
if(name.equals(tableName)){
return true;
}
}
return false;
}
/**查詢**/
protected abstract List<?> checkAll();
/**添加**/
protected abstract void insert(Object obj);
/**刪除**/
protected abstract void delete(Object obj);
/**更新**/
protected abstract void update(Object obj);
}
三 提供一個(gè)裝處理數(shù)據(jù)的對(duì)象
下面是對(duì)象person的代碼,很簡(jiǎn)單,就提供了些基本的set,get方法
package com.example.pei.textdemo.sqlite;
import com.example.pei.textdemo.models.BaseModel;
/**
* Title:
* Description:
* <p>
* Created by pei
* Date: 2017/11/16
*/
public class Person extends BaseModel {
private String name;
private String sex;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
四 Person需要繼承的baseModel類
baseModel主要有兩個(gè)作用:
- 1 實(shí)現(xiàn)Serializable接口,方便數(shù)據(jù)的有序化
- 2 提供 objectToString 方法,作用是將一個(gè)對(duì)象中所有屬性都顯示出來,其實(shí)就是方便我打印log啦
下面是 baseModel 代碼
package com.example.pei.textdemo.models;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Title:
* Description:
* <p>
* Created by pei
* Date: 2017/10/30
*/
public class BaseModel implements Serializable{
/**打印對(duì)象屬性值**/
public String objectToString(Object obj){
List<Map<String,Object>>FiledInfos=getFiledsInfo(obj);
StringBuffer buffer=new StringBuffer();
if(!FiledInfos.isEmpty()){
for(Map<String,Object>map:FiledInfos){
String tag=map.get("name").toString();
if(!"$change".equals(tag)&&!"serialVersionUID".equals(tag)){
String str=map.get("name")+"="+map.get("value")+" ";
buffer.append(str);
}
}
}else{
if(obj!=null){
String className=obj.getClass().getSimpleName();
buffer.append(className);
}else{
buffer.append("objectToString方法調(diào)用參數(shù)為null");
}
}
return buffer.toString();
}
/**
* 獲取屬性類型(type),屬性名(name),屬性值(value)的map組成的list
*/
private List getFiledsInfo(Object obj){
List<Map<String,Object>>list=new ArrayList();
if(obj!=null) {
Field fields[] = obj.getClass().getDeclaredFields();
String fieldNames[] = new String[fields.length];
Map mapInfo = null;
for (int i = 0; i < fields.length; i++) {
Object o = getFieldValueByName(fields[i].getName(), obj);
mapInfo = new HashMap();
mapInfo.put("type", fields[i].getType().toString());
mapInfo.put("name", fields[i].getName());
mapInfo.put("value", getFieldValueByName(fields[i].getName(), obj));
list.add(mapInfo);
}
}
return list;
}
/**
* 根據(jù)屬性名獲取屬性值
*/
private Object getFieldValueByName(String fieldName,Object obj){
Object value=null;
try {
String firstLetter=fieldName.substring(0,1).toUpperCase();
String getter="get" +firstLetter+fieldName.substring(1);
Method method=obj.getClass().getMethod(getter,new Class[] {});
value = method.invoke(obj, new Object[] {});
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return value;
}
/**
* 獲取屬性名數(shù)組
*/
private String[] getFiledName(Object obj){
Field fields[]=obj.getClass().getDeclaredFields();
String fieldNames[]=new String[fields.length];
for(int i=0;i<fields.length;i++){
fieldNames[i]=fields[i].getName();
}
return fieldNames;
}
/***
* 獲取對(duì)象的所有屬性值,返回一個(gè)對(duì)象數(shù)組
*/
private Object[] getFiledValues(Object obj){
String fieldNames[]=this.getFiledName(obj);
Object value[]=new Object[fieldNames.length];
for(int i=0;i<fieldNames.length;i++){
value[i]=this.getFieldValueByName(fieldNames[i],obj);
}
return value;
}
}
五 提供具體的增刪改查類UserDBHelper
此類需要繼承抽象類DBHelper,在activity中涉及到增刪改查時(shí),基本是調(diào)用這個(gè)類中的方法
package com.example.pei.textdemo.sqlite;
import android.database.Cursor;
import java.util.ArrayList;
import java.util.List;
/**
* Title:
* Description:
* <p>
* Created by pei
* Date: 2017/11/16
*/
public class UserDBHelper extends DBHelper{
private UserDBHelper() {
}
private static class Holder {
private static UserDBHelper instance = new UserDBHelper();
}
public static UserDBHelper getInstance() {
return Holder.instance;
}
@Override
protected List<Person> checkAll() {
List<Person> list = new ArrayList<>();
//COLLATE NOCASE 忽略大小寫查詢
// Cursor cursor = getDateBase().rawQuery("select * from T_cpz where isqy='True' COLLATE NOCASE;", null);
Cursor cursor = getDateBase().rawQuery("select * from user", null);
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
String sex = cursor.getString(cursor.getColumnIndex("sex"));
int age=cursor.getInt(cursor.getColumnIndex("age"));
Person person=new Person();
person.setName(name);
person.setSex(sex);
person.setAge(age);
list.add(person);
}
cursor.close();
return list;
}
@Override
protected void insert(Object obj){
Person person= (Person) obj;
String sql="INSERT INTO user(name,sex,age) VALUES('"+ person.getName()+"','"+ person.getSex()+"','"+ person.getAge()+"');";
getDateBase().execSQL(sql);
}
@Override
protected void delete(Object obj) {
Person person = (Person) obj;
String sql = "DELETE FROM user WHERE name='" + person.getName() + "';";
getDateBase().execSQL(sql);
}
@Override
protected void update(Object obj) {
Person person = (Person) obj;
String sql="UPDATE user SET age="+person.getAge()+" WHERE name='"+person.getName()+"';";
getDateBase().execSQL(sql);
}
}
六 下面看看在activity中涉及到的具體數(shù)據(jù)的處理
此處只顯示一些增刪改查的代碼,僅做范例
// //添加
// Person person=new Person();
// person.setName("大和");
// person.setSex("男");
// person.setAge(28);
// Person person1=new Person();
// person1.setName("紅豆");
// person1.setSex("女");
// person1.setAge(26);
// UserDBHelper.getInstance().insert(person);
// UserDBHelper.getInstance().insert(person1);
// List<Person> persons=UserDBHelper.getInstance().checkAll();
// for(Person p:persons){
// LogUtil.e(SqliteActivity.class,"===p="+p.objectToString(p));
// }
// //更新
// Person updatePerson = new Person();
// updatePerson.setName("大和");
// updatePerson.setSex("男");
// updatePerson.setAge(30);
// UserDBHelper.getInstance().update(updatePerson);
// List<Person> persons = UserDBHelper.getInstance().checkAll();
// for (Person p : persons) {
// LogUtil.e(SqliteActivity.class, "===p=" + p.objectToString(p));
// }
// //刪除
// Person deletePerson = new Person();
// deletePerson.setName("大和");
// deletePerson.setSex("男");
// deletePerson.setAge(30);
// UserDBHelper.getInstance().delete(deletePerson);
// List<Person> persons = UserDBHelper.getInstance().checkAll();
// for (Person p : persons) {
// LogUtil.e(SqliteActivity.class, "===p=" + p.objectToString(p));
// }
//查詢所有
List<Person> persons = UserDBHelper.getInstance().checkAll();
for (Person p : persons) {
LogUtil.e(SqliteActivity.class, "===p=" + p.objectToString(p));
}
ok,今天只是對(duì)android數(shù)據(jù)庫(kù)的一個(gè)簡(jiǎn)單講解了,具體到項(xiàng)目中運(yùn)用的時(shí)候,我們還需要對(duì)以上 helper類做針對(duì)性的修改
謝謝誒!