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

来源:互联网 发布:Ubuntu matlab安装教程 编辑:程序博客网 时间:2024/05/19 13:20
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);}// 第一次创建数据库时候调用@Overridepublic void onCreate(SQLiteDatabase db) {String sql = "create table MenuTbl(_id integer primary key autoincrement, typeName text, name text, price integer)";db.execSQL(sql);}// 数据库版本号发生改变时调用@Overridepublic 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();}

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

原创粉丝点击