android 学习随笔四(数据库存储)
SQLite数据库(sqliteexpert工具),sqlite数据库是轻量级数据库,对数据类型要求不是很严格,在数据库中处理是按verchar类型处理,一般定义表字段时还是要求严格按照数据类型定义,方便代码阅读。
- 创建数据库
基于android.database.sqlite.SQLiteOpenHelper创建MyOpenHelper,调用SQLiteDatabase db = oh.getWritableDatabase()方法创建数据库,数据库创建后再调用此方法不会再创建数据库,数据库创建只会执行一次,除非升级数据库(系统根据版本号判断)
-----------------------------------------------------------
public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context, String name, CursorFactory factory,
int version) {
//arg0:上下文
//arg1:数据库文件名
//arg2:游标工厂,游标等同于结果集,传NULL使用默认工厂
//arg3:版本号不能小于1,用于升级
super(context, name, factory, version);
}
//创建数据库时调用
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println("数据库创建");
}
//升级数据库调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("数据库升级");
}
}
------------------------------------------------------------------------------------------------
为防止在调用时写错数据库名、版本号,可以写死数据库名、版本号
public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context) {//本来是四个参数,只用一个参数,其他参数不用传递
//arg0:上下文
//arg1:数据库文件名
//arg2:游标工厂,游标等同于结果集,传NULL使用默认工厂
//arg3:版本号不能小于1,用于升级
super(context, "people.db", null, 1);
}
-------------------------------------------------------------------------------------------------
public class Test extends AndroidTestCase {
public void test(){
//获取虚拟上下文
MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);
//如果数据库不存在,先创建数据库,再打开;否则直接打开数据库
SQLiteDatabase db = oh.getWritableDatabase();
}
}
-------------------------------------------------------------------------------------------------------
- 创建表(在创建数据库时创建表)
//创建数据库时调用
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table person(_id integer primary key autoincrement,name char(10),phone char(20),salary integer(10))";
//创建表
db.execSQL(sql);
}
- 插入数据
public class Test extends AndroidTestCase {
public void test(){
//获取虚拟上下文
MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);
//如果数据库不存在,先创建数据库,再打开;否则直接打开数据库
SQLiteDatabase db = oh.getWritableDatabase();
}
public void insert(){
MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);
SQLiteDatabase db = oh.getWritableDatabase();
//<!-- $s表示该占位符要求传入字符串,$d表示该占位符要求传入整数 -->
String sql=String.format("insert into person(name,phone,salary)values(%1$s,%2$d,%3$d)","春晓",138438,13000);
db.execSQL(sql);
//或者用如下
db.execSQL("insert into person(name,phone,salary)values(?,?,?)", new Object[]{"春晓",138438,13000});
db.close();
}
}
- 删除、修改、查询数据(结构调整)
--------------------------------------------------------------------------------------------------------------
public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context) {
//arg0:上下文
//arg1:数据库文件名
//arg2:游标工厂,游标等同于结果集,传NULL使用默认工厂
//arg3:版本号不能小于1,用于升级
super(context, "people.db", null, 1);
}
//创建数据库时调用
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table person(_id integer primary key autoincrement,name char(10),phone char(20),salary integer(10))";
//创建表
db.execSQL(sql);
}
//升级数据库调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("数据库升级");
}
}
-----------------------------------------------------------------------------------------------------------------------------------
public class Test extends AndroidTestCase {
private MyOpenHelper oh;//不能在此NEW此对象,此时测试框架还没有创建,无法提供虚拟上下文
private SQLiteDatabase db;
//测试方法执行之前先执行SETUP
@Override
protected void setUp() throws Exception {
super.setUp();
oh = new MyOpenHelper(getContext());//获取虚拟上下文
//如果数据库不存在,先创建数据库,再打开;否则直接打开数据库
db = oh.getWritableDatabase();
}
//在测试结束之后执行
@Override
protected void tearDown() throws Exception {
super.tearDown();
db.close();
}
public void insert(){
//<!-- $s表示该占位符要求传入字符串,$d表示该占位符要求传入整数 -->
String sql=String.format("insert into person(name,phone,salary)values(%1$s,%2$d,%3$d)","春晓",138438,13000);
db.execSQL(sql);
//或者用如下
db.execSQL("insert into person(name,phone,salary)values(?,?,?)", new Object[]{"春晓",138438,13000});
}
public void delete(){
db.execSQL("delete from person where name=?", new Object[]{"春晓"});
}
public void update(){
db.execSQL("update person set salary=? where name=?", new Object[]{13200,"春晓"});
}
public void select(){
Cursor cursor = db.rawQuery("select * from person", null);
//把指针移动到下一行
while(cursor.moveToNext()){
//先通过列名获取列索引,然后再获取该列的内容
String name = cursor.getString(cursor.getColumnIndex("name"));
}
}
--------------------------------------------------------------------------------------------------------
在实际数据库操作中,基本不用上述方法,而是用谷歌提供的API操作
public void insertApi(){
ContentValues values = new ContentValues();
//字段名,值
values.put("name","杨松");
values.put("phone","138888");
values.put("salary","130201");
//返回值-1,操作失败,第二个参数是values 为空时,给哪个字段插入NULL
long l=db.insert("person", null, values);
}
int i = db.delete("person", "_id=?", new String[]{"6"});
//被修改字段修改后的值
values.put("name","鲁智深");
int c = db.update("person", values, "_id=?", new String[]{"5"});
//表名,字段名(NULL表示所有字段),查询的WHERE条件,WHERE条件的占位符,分组,,排序,分页
//Cursor cursor=db.query("person", new String[]{"name","phone","salary"}, "_id=?", new String[]{"5"}, null, null, null);
Cursor cursor=db.query("person", null, null, null, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
int salary = cursor.getInt(cursor.getColumnIndex("salary"));
}
- 数据库事务操作
public void transaction(){
try {
//开启事务
db.beginTransaction();
ContentValues values=new ContentValues();
values.put("salary", 13199);
db.update("person", values, "name=?", new String[]{"杨松"});
values.clear();
values.put("salary", 13202);
db.update("person", values, "name=?", new String[]{"春晓"});
//设置事务执行成功,提交时如果这行代码没有执行过,就会回滚
db.setTransactionSuccessful();
} finally {
//关闭事务,提交数据
db.endTransaction();
}
}