安卓学习之sqlite

sqlite保存下来的数据在如下位置可以查到:

Android Studio4.0中正确的打开Android Device Monitor

数据库写入数据的步骤:

一. 创建数据库:

首先我们要看这个SqliteOpenhelper:

1).写一個类去继承SqliteOpenhelper(该类方法有两个回调方法:oncreate()和onUpgrade()方法)

public class DatabaseHelper extends SQLiteOpenHelper {

    /**
     * 
     *  context  上下文
     *  name     姓名
     *  factory  工厂
     *  version  版本号
     */
    public DatabaseHelper(@Nullable Context context) {
        super(context, Constant.DATABASE_NAME, null, Constant.VERSION);
    }
/**
     * Called when the database is created for the first time
     * @param db
     *第一次创建数据库时才会被调用
*/
public void onCreate(SQLiteDatabase db) {
        //创建数据库是的回调
        Log.d(TAG,"创建数据库");
        String sql = "create table "+Constant.TABLE_NAME+"(_id integer ,name varchar,age integer,salary integer);";
        db.execSQL(sql);
    }


/**Called when the database needs to be upgraded. The implementation
should use this method to drop tables, add tables, or do anything else it
needs to upgrade to the new schema version.
当需要修改数据库的字段或者增加删除一些列时才进行
版本号只能从低到高,int类型,不支持多列添加
*/

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        //升级数据库时的回调
        Log.d(TAG,"升级数据库");
        String sql;
        switch (oldVersion){
            case 1:
                sql = "alter table "+Constant.TABLE_NAME+ " add column phone integer;";
                db.execSQL(sql);
                break;
            case 2:
                sql = "alter table "+Constant.TABLE_NAME+ " add column address varchar;";
                db.execSQL(sql);
                break;
        }
    }

2).实现里面的方法,创建构造方法

参数解释:

   /**

     * @ context 上下文

     * @ name    数据库名称

     * @ factory 游标工厂

     * @ version 版本号

     */

3).创建这个子类对象,再调用getReadableDatabase()、getWriteableDatabase()方法,即可创建数据库。

//创建数据库
        DatabaseHelper helper = new DatabaseHelper(this);
// Create and/or open a database that will be used for reading and writing.
        helper.getWritableDatabase();

4)创建完成后,即可在路径下找到所生成的数据库文件

 

 

在dao层进行CRUD操作

创建数据库:

public Dao(Context context){
        //创建数据库
        mHelper = new DatabaseHelper(context);
    }

对数据库进行操作:

法一. 进行操作之前,获得想要进行操作的数据库

SQLiteDatabase db = mHelper.getWritableDatabase();

//增
public void insert(){
    //获得想要操作的数据库
    // Create and/or open a database that will be used for reading and writing.
    SQLiteDatabase db = mHelper.getWritableDatabase();
    //防止SQL注入,将所填入的字符群不将其当成参数传入
    String sql = "insert into "+Constant.TABLE_NAME+"(_id,name,age,salary) values (?,?,?,?)";
    db.execSQL(sql,new Object[]{1,"hyy",16,4522});
    db.close();               //记得完成操作之后关闭数据库
}

(?,?,?,?)防止SQL注入

问题来了,”?"到底做了什么才防止了sql注入呢?

"?"会把参数当做值来处理,不管参数是什么,都把它插入表就完事。
而直接的字符串拼接是把参数当做SQL语句的一部分,参数中有SQL语句的话,是有可能被执行的。

 

数据库查询操作时,db.execSQL(sql); 返回值时void,因此需要db.rawQuery()方法,返回值是Cursor游标类型

注意游标是资源,最后应将游标关闭。

Cursor.close();

//查
public void query(){
    //获得数据库
    SQLiteDatabase db = mHelper.getReadableDatabase();
    String sql = "select * from "+Constant.TABLE_NAME;
    //db.execSQL(sql); 返回值时void
    Cursor cursor = db.rawQuery(sql, null);
    //将所有姓名展示出来
    while (cursor.moveToNext()){
        int index = cursor.getColumnIndex("name");
        String name = cursor.getString(index);
        Log.d(TAG,"姓名"+name);
    };
    cursor.close();
}

法二. Android API进行操作(不懂查源码)

查询操作:

Cursor cur = db.query(TABLE_NAME, col, null, null, null, null, null)语句将查询到的数据放到一个Cursor 当中。 
这个Cursor里边封装了这个数据表TABLE_NAME当中的所有条列。  
   query()方法相当的有用,在这里我们简单地讲一下。 
   第一个参数是数据库里边表的名字,比如在我们这个例子,表的名字就是TABLE_NAME,也就是"diary"。 
   第二个字段是我们想要返回数据包含的列的信息。在这个例子当中我们想要得到的列有title、body。我们把这两个列的名字放到字符串数组里边来。 
  第三个参数为selection,相当于SQL语句的where部分,如果想返回所有的数据,那么就直接置为null。 
   第四个参数为selectionArgs。在selection部分,你有可能用到“?”,那么在selectionArgs定义的字符串会代替selection中的“?”。 
   第五个参数为groupBy。定义查询出来的数据是否分组,如果为null则说明不用分组。 
   第六个参数为having ,相当于SQL语句当中的having部分。 
   第七个参数为orderBy,来描述我们期望的返回值是否需要排序,如果设置为null则说明不需要排序。
public void update(){
    SQLiteDatabase db = mHelper.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("age",12);
    values.put("salary",11111);
    db.update(Constant.TABLE_NAME,values,"name = 'hyy'",null);
    db.close();
}


int delete = db.delete(Constant.TABLE_NAME, "name = 'hyy'", null);
Log.d(TAG,"删除的行数:"+delete);


//插入数据
ContentValues values = new ContentValues();
values.put("name","zhangsan");
values.put("_id",5);
values.put("age",20);
values.put("salary",5555);

db.insert(Constant.TABLE_NAME,null,values);
db.close();


创建Junit单元测试

androidTest是整合测试,可以运行在设备或虚拟设备上,需要编译打包为APK在设备上运行,可以实时查看细节

test 是单元测试,运行在本地开发机上,可以脱离Android运行环境,速度快

1)选择AndroidTest测试类

2)添加两个注解,编写测试类进行测试

Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();

3)测试方法中获取上下文

 

 

数据库事务

db.beginTransaction();
//执行完成后数据库才会修改两个,否则直接执行异常事务处理
db.setTransactionSuccessful();
db.endTransaction();

有两个特点:

1、安全性

情景:

每个月15号,你公司都会给你发工资。

操作過程:

公司 的财务账号有1000000,那么它要-12000

那你的账号就要增减12000

可能在这个过程中,出现了问题,比如说,停电,那么公司账号上减了钱,但是你的账号没钱进入。

这个时候,就可以使用数据库事务来结决这个问题。

2、高效性

使用普通的形式向数据添加3000数据。

 usetime === 15204

再使用开启事务的形式插入3000条数据

usetime === 218

对比耗时多少:

原理:这个没开始事务的是打开数据库,插入数据,关闭数据库。(耗时很多)

开启事务的:把数据存到内存里,然后一次写入到数据库里。

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值