Android数据存储之使用SQLite数据库存储数据
2013-04-29 23:38
381 查看
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类:
MenuService业务类:
MenuServiceTest测试类:
2.删除数据的测试结果为:
3.更新数据的测试结果为:
4.查询数据的测试结果为:
5.分页查询数据的测试结果为:
6.返回记录数的测试结果为:
7.执行SQLite事务的测试结果为:
8.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(); }
编写测试方法,观察测试结果:
相关文章推荐
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
- Android开发8:数据存储(二)——SQLite数据库和ContentProvider的使用
- 初学Android,数据存储之使用SQLite数据库(四十五)
- android基础--使用嵌入式关系型SQLite数据库存储数据
- Android数据存储之Sqlite数据库的俩种使用方式
- 初学Android,数据存储之使用SQLite数据库(四十六)
- Android进阶#(5/12)独特高效的数据存储——SQLite数据库_数据库框架ActiveAndroid的使用与基本原理
- Android 存储数据之3 使用SQLite数据库存储
- Android中使用嵌入式关系型SQLite数据库存储数据
- Android中使用嵌入式关系型SQLite数据库存储数据
- 【转】Android使用嵌入式关系型SQLite数据库存储数据【学习记录】
- Android笔记使用嵌入式关系型SQLite数据库存储数据
- Android数据存储(六)、SQLite数据库使用实例
- Android平台使用SQLite数据库存储数据
- Android数据存储—使用SQLite数据库
- android(19)_数据存储与访问_SQLite数据库_使用SQLiteDatabase提供的增删改查方法
- 详解Android数据存储―使用SQLite数据库
- android(18)_数据存储与访问_SQLite数据库_使用SQLiteDatabase操作SQLite数据库及事务
- Android 之 使用嵌入式关系型SQLite数据库存储数据
- Android数据存储—使用SQLite数据库