SQLite存储数据

来源:互联网 发布:端口占用解决方法 编辑:程序博客网 时间:2024/06/06 06:44

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);}@Overridepublic 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语句创建表格}@Overridepublic 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 + "')");}}


SQLiteDatabase类为我们提供了很多种方法,上面的代码中基本上囊括了大部分的数据库操作;对于添加、更新和删除来说,我们都可以使用
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方法的参数也是一样





0 0
原创粉丝点击