SQLite是轻量级嵌入式数据库引擎,它支持
SQL 语言,并且只利用很少的内存就有很好的性能。
它支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型虽然只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。
首先我们需要自定义 MyDatabaseHelper 继承 SQLiteOpenHelper
public class MyDatabaseHelper extends SQLiteOpenHelper {
private String mTableName = "HISTORY";//表名
//列
private static final String USER_ID = "user_id";
private static final String PRODUCT_ID = "product_id";
private static final String IMG_SRC = "img_src";
private static final String PRODUCT_NAME = "product_name";
private static final String PRODUCT_BRAND = "product_brand";
private static final String MOBILE_PRICE = "mobile_price";
private String[] mColumns = new String[]{
USER_ID,
PRODUCT_ID,
IMG_SRC,
PRODUCT_NAME,
PRODUCT_BRAND,
MOBILE_PRICE
};
/**
* @param context
* @param name 数据库名
* @param factory 一般传null
* @param version 数据库版本,可以通过提高版本号进行数据库更新,会调用onUpgrade()
*/
public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
StringBuilder CREATE_TABLE = new StringBuilder();
CREATE_TABLE.append("create table if not exists " + mTableName + " (" + "id integer primary key autoincrement");
for (int i = 0; i < mColumns.length; i++) {
CREATE_TABLE .append(", " + mColumns[i]);
}
CREATE_TABLE .append(")");
db.execSQL(CREATE_TABLE .toString());//根据SQL语句创建表格
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists " + mTableName);
onCreate(db);
}
}
然后我们需要一个类来对数据库操作进行封装,方便调用:
public class HistorySQLiteHelper {
private static HistorySQLiteHelper mHistorySQLiteHelper;
//单例设置
public static HistorySQLiteHelper getInstance(){
if (mHistorySQLiteHelper == null) {
mHistorySQLiteHelper = new HistorySQLiteHelper();
}
return mHistorySQLiteHelper;
}
public MyDatabaseHelper dbHelper;
private HistorySQLiteHelper() {
//生成SQLiteOpenHelper 实体
dbHelper = new MyDatabaseHelper(App.getContext(), "LAOBAI.db", null, 1);
dbHelper.onCreate(dbHelper.getWritableDatabase());
}
/**
* 插入数据
* @param user_id 用户id
*/
public void add(String user_id, Product info){
if (info == null) {
return;
}
SQLiteDatabase db = dbHelper.getWritableDatabase();
delete(user_id, info.getProduct_id());
ContentValues values = new ContentValues();
values.put(USER_ID, user_id);
values.put(PRODUCT_ID, info.getProduct_id());
values.put(IMG_SRC, info.getImg_src());
values.put(PRODUCT_NAME, info.getProduct_name());
values.put(PRODUCT_BRAND, info.getProduct_brand());
values.put(MOBILE_PRICE, info.getMobile_price());
db.insert(getTableName(), null, values);
}
/**
* 更新
*/
public void update(){
}
/**
* 删除数据
* @param user_id
* @param product_id
*/
public void delete(String user_id, String product_id){
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("delete from " + getTableName() + " where user_id= '" + user_id + "' and product_id = '" + product_id + "'");
}
/**
* 清空数据
*/
public void clear(){
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("delete from " + getTableName());
}
/**
* 查询某个用户的记录
* @param user_id
*/
public List<Product> query(String user_id){
List<Product> list = new ArrayList<Product>();
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 查询Book 表中所有的数据
Cursor cursor = db.rawQuery("select * from " + getTableName() + " where user_id = ? order by id desc", new String[]{user_id});
if (cursor.moveToFirst()) {
do {
if (list.size() > 20) {
break;
}
// 遍历Cursor对象
Product info = new Product();
info.setProduct_id(cursor.getString(cursor.getColumnIndex(PRODUCT_ID)));
info.setImg_src(cursor.getString(cursor.getColumnIndex(IMG_SRC)));
info.setProduct_name(cursor.getString(cursor.getColumnIndex(PRODUCT_NAME)));
info.setProduct_brand(cursor.getString(cursor.getColumnIndex(PRODUCT_BRAND)));
info.setMobile_price(cursor.getString(cursor.getColumnIndex(MOBILE_PRICE)));
list.add(info);
} while (cursor.moveToNext());
}
cursor.close();
return list;
}
/**
* 获取用户的记录条数
* @param user_id
* @return
*/
public long queryCount(String user_id){
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select count(*) from " + getTableName() + " where user_id = ?", new String[]{user_id});
cursor.moveToFirst();
return cursor.getLong(0);
}
/**
* 删除id最小的一条数据
* @param user_id
*/
public void deleteFirst(String user_id){
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("delete from " + getTableName() + " where id= (select min(id) from " + getTableName() + " where user_id= '" + user_id + "')");
}
}
db.executeSQL(String sql);
db.executeSQL(String sql, Object[] bindArgs);//sql语句中使用占位符,然后第二个参数是实际的参数集
通过自己编写的SQL语句进行操作;
也可以使用SQLiteDatabase提供的单独的操作方法
db.insert(String table, String nullColumnHack, ContentValues values);
db.update(String table, Contentvalues values, String whereClause, String whereArgs);
db.delete(String table, String whereClause, String whereArgs);
第一个参数都是表示要操作的表名;
insert中的第二个参数表示如果插入的数据每一列都为空的话,需要指定此行中某一列的名称,系统将此列设置为NULL,不至于出现错误;
insert中的第三个参数是ContentValues类型的变量,是键值对组成的Map,key代表列名,value代表该列要插入的值;
update的第二个参数也很类似,只不过它是更新该字段key为最新的value值,第三个参数whereClause表示WHERE表达式,比如“age > ? and age < ?”等,最后的whereArgs参数是占位符的实际参数值;
delete方法的参数也是一样