android 69 SQLite数据库
package com.itheima.sqlitedatabase; import java.sql.ResultSet; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class MyOpenHelper extends SQLiteOpenHelper { //安卓的数据库不是sql,oracle,用的是sqlite,是安卓内置的数据库, //SQLiteOpenHelper是打开数据库帮助器,这是一个抽象类,要创建她的子类重写里面的方法。 public MyOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version);//Activity在95%都是Context,name是数据库文件名,factory是游标工厂用于创建游标的,version是数据库的版本号,版本号是方便升级用的,版本号开始为1改为2后就会自动调用api进行升级。 } //数据库创建时,此方法会调用 @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table person(_id integer primary key autoincrement, name char(10), salary char(20), phone integer(20))"); } //数据库升级version从1改到2时会调用,此方法会调用 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { System.out.println("数据库升级了"); } }
package com.itheima.sqlitedatabase.test; import com.itheima.sqlitedatabase.MyOpenHelper; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.test.AndroidTestCase; public class TestCase extends AndroidTestCase { //AndroidTestCase类加载的时候,代码从上向下执行,执行到这行代码时此时测试框架AndroidTestCase类还没有初始化完毕,没有虚拟上下文对象 // private MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1); private MyOpenHelper oh; private SQLiteDatabase db; public void test(){ //getContext():获取一个虚拟的上下文,之前用的是this,这里代码不是运行在应用里面是运行在测试框架里面的,应用没有运行是没有上下文对象的,测试框架不是activity的子类,所以用getContext()获取虚礼上下文,MyOpenHelper为帮助器 MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);//CursorFactory游标工厂为null表示使用默认的工厂,版本号为1, //如果数据库不存在,先创建数据库调用MyOpenHelper的onCreate方法,数据库在内部存储中data/data/应用名/database/people.db,再获取可读可写的数据库对象db,如果数据库存在,就直接打开 SQLiteDatabase db = oh.getWritableDatabase();//获取可读可写数据库对象 //如果存储空间满了,那么返回只读数据库对象 // SQLiteDatabase db = oh.getReadableDatabase();//获取可读可写数据库对象 } //测试框架初始化完毕之后,在测试方法(insert,test,delete右键方法名run as执行)执行之前,此方法调用 @Override protected void setUp() throws Exception { super.setUp(); oh = new MyOpenHelper(getContext(), "people.db", null, 1); db = oh.getWritableDatabase(); } //测试方法执行完毕之后,此方法调用 @Override protected void tearDown() throws Exception { // TODO Auto-generated method stub super.tearDown(); db.close(); } public void insert(){ //SQLite是轻量级数据库,轻量级也就牺牲了部分功能,输入的时候不检测数据格式。 oh = new MyOpenHelper(getContext(), "people.db", null, 1); db = oh.getWritableDatabase(); // db.execSQL("insert into person (name, salary, phone)values(?, ?, ?)", new Object[]{"小志的老婆[1]", "13000", 138438}); // db.execSQL("insert into person (name, salary, phone)values(?, ?, ?)", new Object[]{"小志的儿子", 14000, "13888"}); db.execSQL("insert into person (name, salary, phone)values(?, ?, ?)", new Object[]{"小志", 14000, "13888"});//id不用插入 db.close(); } public void delete(){ db.execSQL("delete from person where name = ?", new Object[]{"小志"}); } public void update(){ db.execSQL("update person set phone = ? where name = ?", new Object[]{186666, "小志的儿子"}); } public void select(){ //execSQL没有返回值,Cursor就是结果集,null是填充占位符用的, Cursor cursor = db.rawQuery("select name, salary from person", null); while(cursor.moveToNext()){ //通过列索引获取列的值 String name = cursor.getString(cursor.getColumnIndex("name")); //通过序号1获取 String salary = cursor.getString(1); System.out.println(name + ";" + salary); } } public void insertApi(){ //把要插入的数据全部封装至ContentValues对象 ContentValues values = new ContentValues(); values.put("name", "游天龙"); values.put("phone", "15999"); values.put("salary", 16000); db.insert("person", null, values); } public void deleteApi(){ int i = db.delete("person", "name = ? and _id = ?", new String[]{"小志的儿子", "3"});//返回删除了几行 System.out.println(i); } public void updateApi(){ ContentValues values = new ContentValues(); values.put("salary", 26000); int i = db.update("person", values, "name = ?", new String[]{"游天龙"});//后面是where条件 System.out.println(i); } public void selectApi(){ Cursor cursor = db.query("person", null, null, null, null, null, null, null); while(cursor.moveToNext()){ String name = cursor.getString(cursor.getColumnIndex("name")); String phone = cursor.getString(cursor.getColumnIndex("phone")); String salary = cursor.getString(cursor.getColumnIndex("salary")); System.out.println(name + ";" + phone + ";" + salary); } } public void transaction(){ try{ //开启事务 db.beginTransaction(); ContentValues values = new ContentValues(); values.put("salary", 12000); db.update("person", values, "name = ?", new String[]{"小志"}); values.clear(); values.put("salary", 16000); db.update("person", values, "name = ?", new String[]{"小志的儿子"}); int i = 3/0; //设置 事务执行成功,如果这行代码没有执行就执行下面的语句则sql就回滚。 db.setTransactionSuccessful(); } finally{ //关闭事务,同时提交(不需要commit()),如果已经设置事务执行成功,那么sql语句就生效了,反之,sql语句回滚 db.endTransaction(); } } }