• 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();
            }
        }
    }
  • 相关阅读:
    【loj6179】Pyh的求和
    【bzoj4036】按位或
    【CF472G】Design Tutorial: Increase the Constraints
    【bzoj4811】由乃的OJ
    双马尾机器人(???)
    【codechef】Children Trips
    【bzoj3796】Mushroom追妹纸
    【bzoj4571】美味
    前夕
    【bzoj3589】动态树
  • 原文地址:https://www.cnblogs.com/yaowen/p/4927833.html
Copyright © 2020-2023  润新知