Android数据存储之使用SQLite数据库存储数据

Android数据存储之使用SQLite数据库存储数据
在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。
这里使用SQLite数据库存储一个MenuTbl(_id、typeName、name、price):
项目设计:
DBOpenHelper类:
public class DBOpenHelper extends SQLiteOpenHelper {

	private static final String DATABASE = "mydb.db";
	private static final int VERSION = 1;

	public DBOpenHelper(Context context) {
		super(context, DATABASE, null, VERSION);
	}

	// 第一次创建数据库时候调用
	@Override
	public void onCreate(SQLiteDatabase db) {
		String sql = "create table MenuTbl(_id integer primary key autoincrement, typeName text, name text, price integer)";
		db.execSQL(sql);
	}

	// 数据库版本号发生改变时调用
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		String sql = "drop table if exists MenuTbl";
		db.execSQL(sql);
		onCreate(db);
	}
}

MenuService业务类:
public class MenuService {

	private DBOpenHelper dbOpenHelper;

	public MenuService(Context context) {
		dbOpenHelper = new DBOpenHelper(context);
	}

	// 保存数据
	public void save() {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		db.execSQL("insert into MenuTbl(typeName,name,price) values('主食类','排骨蒸米粉',15)");
		db.execSQL("insert into MenuTbl(typeName,name,price) values('主食类','清凉寿司卷',12)");
		db.execSQL("insert into MenuTbl(typeName,name,price) values('主食类','养生八宝饭',10)");
		db.execSQL("insert into MenuTbl(typeName,name,price) values('菜品类','糖醋排骨',20)");
		db.execSQL("insert into MenuTbl(typeName,name,price) values('菜品类','麻婆豆腐',8)");
		db.execSQL("insert into MenuTbl(typeName,name,price) values('菜品类','鱼香茄子',12)");
		db.execSQL("insert into MenuTbl(typeName,name,price) values('汤饮类','西红柿蛋汤',8)");
		db.execSQL("insert into MenuTbl(typeName,name,price) values('汤饮类','果汁',5)");
		db.execSQL("insert into MenuTbl(typeName,name,price) values('汤饮类','啤酒',4)");
		Log.i("MenuService", "插入成功!");
		db.close();
	}

	// 删除数据
	public void delete() {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		db.execSQL("delete from MenuTbl where name='啤酒'");
		Log.i("MenuService", "删除成功!");
		db.close();
	}

	// 更新数据
	public void update() {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		db.execSQL("update MenuTbl set price = 4 where _id = 8");
		Log.i("MenuService", "更新成功!");
		db.close();
	}

	// 查询数据
	public Menu query(int _id) {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		Cursor cursor = db.rawQuery("select * from MenuTbl where _id=?",
				new String[] { _id + "" });
		while (cursor.moveToNext()) {
			int id = cursor.getInt(cursor.getColumnIndex("_id"));
			String typeName = cursor.getString(cursor
					.getColumnIndex("typeName"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			int price = cursor.getInt(cursor.getColumnIndex("price"));
			Menu menu = new Menu(id, typeName, name, price);
			return menu;
		}
		db.close();
		return null;
	}

	// 分页查询(跳过offset条记录,获取maxResult条记录)
	public Cursor getCursorScrollData(int offset, int maxResult) {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		Cursor cursor = db.rawQuery(
				"select * from MenuTbl order by _id asc limit ?,?",
				new String[] { offset + "", maxResult + "" });
		return cursor;
	}

	// 返回记录数
	public long getCount() {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		Cursor cursor = db.rawQuery("select count(*) from MenuTbl", null);
		cursor.moveToFirst();
		long result = cursor.getLong(0);
		return result;
	}

	// 执行SQLite事务
	// (_id 1的价格下调1元, _id 2的价格上调2元 ,假设这次更新价格要么都成功要么都不更新)
	public void transaction() {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		db.beginTransaction();// 开启事务
		try {
			db.execSQL("update MenuTbl set price=price-1 where _id=1");
			db.execSQL("update MenuTbl set price=price+2 where _id=2");
			db.setTransactionSuccessful();// 设置事务的标志为True
		} finally {
			db.endTransaction();// 结束事务,有两种情况:commit,rollback
			// 事务的提交或回滚是由事务的标志决定的,如果事务的标志为True,
			// 事务就会提交,否则回滚,默认情况下事务的标志为False
		}

	}

}

MenuServiceTest测试类:
public class MenuServiceTest extends AndroidTestCase {

	// 测试创建数据库,数据库表,及更改数据库表
	public void testCreateDB() throws Exception {
		DBOpenHelper dbOpenHelper = new DBOpenHelper(getContext());
		dbOpenHelper.getWritableDatabase();
	}

	// 测试插入
	public void testSave() {
		MenuService service = new MenuService(getContext());
		service.save();
	}

	// 测试删除
	public void testDelete() {
		MenuService service = new MenuService(getContext());
		service.delete();
	}

	// 测试更新
	public void testUpdate() {
		MenuService service = new MenuService(getContext());
		service.update();
	}

	// 测试查询
	public void testQuery() {
		MenuService service = new MenuService(getContext());
		Menu menu = service.query(4);
		Log.i("MenuService", menu.toString());
	}

	// 测试分页
	public void testScrollData() {
		MenuService service = new MenuService(getContext());
		Cursor cursor = service.getCursorScrollData(1, 4);
		while (cursor.moveToNext()) {
			int _id = cursor.getInt(cursor.getColumnIndex("_id"));
			String typeName = cursor.getString(cursor
					.getColumnIndex("typeName"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			int price = cursor.getInt(cursor.getColumnIndex("price"));
			Menu menu = new Menu(_id, typeName, name, price);
			Log.i("MenuService", menu.toString());
		}
	}

	// 测试记录数
	public void testGetCount() {
		MenuService service = new MenuService(getContext());
		long count = service.getCount();
		Log.i("MenuService", count + "");
	}

	// 测试SQLite中执行事务
	public void testTransaction() {
		MenuService service = new MenuService(getContext());
		service.transaction();
	}

}
1.插入数据的测试结果为:

2.删除数据的测试结果为:
3.更新数据的测试结果为:
4.查询数据的测试结果为:
5.分页查询数据的测试结果为:
6.返回记录数的测试结果为:
7.执行SQLite事务的测试结果为:
8.SQLite的数据库操作实例本身也提供了增、删、改、查等方法;例如插入数据:
public void otherSave() {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put("typeName", "汤饮类");
		values.put("name", "啤酒");
		values.put("price", 4);
		db.insert("MenuTbl", null, values);
		db.close();
	}

编写测试方法,观察测试结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值