您的位置:首页 > 移动开发 > Android开发

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类:
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();
}


编写测试方法,观察测试结果:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐