SQLite存储数据

本文介绍了一个具体的SQLite数据库应用实例,包括数据库的创建、基本操作如增删改查的方法实现,以及如何通过自定义类进行数据库操作的封装。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 + "')");
	}
}


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方法的参数也是一样





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值