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

 

posted @ 2015-11-01 15:25  无天666  阅读(314)  评论(0编辑  收藏  举报