• android SQLite数据库总结


    SQLite

      SQLite是一种超轻量级的嵌入式数据库,大小只有几百KB,但是其语法支持标准SQL语法,同时还遵循了数据库的ACID事务,所以学过其他数据库的开发人员都很容易掌握其使用。

      sql语法就不介绍了,直接看在android中的使用

    SQLiteOpenHelper——封装好的数据库操作辅助类,需重写

      重写方法

        onCreate:初始化数据库,创建表,添加初始数据

        onUpgrade:数据库版本升级时的数据库操作,如备份删除数据库等

      常用方法

        getReadableDatabase()    获取SQLiteDatabase对象,操作数据库

        getWritableDatabase()        获取SQLiteDatabase对象,操作数据库

        区别:在磁盘空间满或不可写时,1方法将获得只读的数据库对象,而2方法会报错,在正常情况下,获取到的都是可读写的数据库对象。

    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    
    public class DBHelper extends SQLiteOpenHelper {
    
        private static final String name="my";//数据库名
        private static final int version=1;//版本号
    
        //重写构造方法的时候选择参数少的一项
        public DBHelper(Context context) {
            //1:上下文 2:数据库名称 3:游标创建工厂 4:数据库版本 版本只能是整数 1 2 3..
            super(context, name, null, version);
        }
    
        //数据库的初始化 SQLiteDatabase数据库操作对象
        //一般只在第一次运行和版本更新的时候调用
        @Override
        public void onCreate(SQLiteDatabase db) {
            //创建数据库  主键默认自增
            db.execSQL("create table student(" +
                    "_id integer not null primary key autoincrement," +
                    "name varchar(20)," +
                    "phone varchar(11)," +
                    "gender varchar(2))");
            //添加一条测试数据
            db.execSQL("insert into student values(null,?,?,?)"
                    ,new Object[]{"小黑","12345678901","男"});
        }
    
        /**
         * 在版本升级的时候调用
         * 修改version 为2 表示版本升级 就会调用这个方法
         * @param db 数据库操作对象
         * @param oldVersion 旧版本号
         * @param newVersion 新版本号
         */
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    }

    在android数据库的创建是需要创建对象才能创建的

    在activity类中创建出一个数据库类对象

    创建好数据对象就可以操作数据了 通过SQLiteDatabase获取   两种获取方法的区别上面已经提到过了

         //创建数据
            DBHelper helper =new DBHelper(this);
            //调用数据操作对象
            SQLiteDatabase dbWrite=helper.getWritableDatabase();
            SQLiteDatabase dbRead=helper.getReadableDatabase();

    SQLiteDatabase给我们提供了很多操作数据的方法 

    删除:(int) delete(String table,String whereClause,String[] whereArgs) 

       table: 表名

       whereClause:where条件  列名 占位符  id=?

       whereArgs:参数值数组

    添加:(long) insert(String table,String nullColumnHack,ContentValues values)  

        nullColumnHack:为空列

        ContentValues values:通过键值对存储添加的数据  key为列 value为值

        insert方法 底层是通过拼接字符串的方式 如果ContentValues是空的 拼接成的sql语句无法执行会报错 所以给一个可以为空的列 当ContentValues为空时也可以执行 有兴趣的可以看一下源码

    更新:(int) update(String table, ContentValues values, String whereClause, String[] whereArgs)

        参数意思同上

    查询:(Cursor) query(boolean distinct,String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

        返回值是一个游标   这个query参数较多 简单的查询就还是写一条sql语句简单点

          boolean distinct 去重复

          String table 表名

          String[] columns要查询的列

          String selection查询条件

          String[] selectionArgs查询参数值

          String groupBy分组

          String having分组条件

          String orderBy排序

          String limit分页查询限制

    关闭数据库:(void) close()

    执行一条sql语句:(void) execSQL(String sql) 增删改查

    查询查询sql:(Cursor) rawQuery(String sql, String[] selectionArgs)

    事务

            try {
                db.beginTransaction();//开启事务
                // db.update();
                // db.insert();
                db.setTransactionSuccessful(); //没有设置事物成功 finally就会回滚
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                db.endTransaction();
            }    

    贴代码咯  执行sql语句 和封装好的方法

    查询

       private void query() {
            StringBuffer sb=new StringBuffer("select * from student where 1=1");
            //参数集合
            List<String> params=new ArrayList<>();
            if(!TextUtils.isEmpty(id)){
                sb.append(" and _id=?");
                params.add(id);
            }
            if(!TextUtils.isEmpty(phone)){
                sb.append(" and phone=?");
                params.add(phone);
            }
            if(!TextUtils.isEmpty(name)){
                sb.append(" and name=?");
                params.add(name);
            }
            if(!TextUtils.isEmpty(gender)){
                sb.append(" and gender=?");
                params.add(gender);
            }
            SQLiteDatabase db=helper.getReadableDatabase();
            String [] projection=new String [params.size()];
            params.toArray(projection);
            //返回值 游标
            Cursor cursor=db.rawQuery(sb.toString(),projection);
        //判断游标是否为空,是否有一个值
    while(cursor!=null&&cursor.moveToNext()){ // getColumnIndex获取列的下标 cursor.getXXXX()获取指定列的值 String name=cursor.getString(cursor.getColumnIndex("name")); Integer id=cursor.getInt(cursor.getColumnIndex("_id")); } }

    用不到的参数就让它为空吧   遍历数据就while循环就好咯

    Cursor c = db.query("student",null,null,null,null,null,null);//查询并获得游标

    更新

      private void update() {
            StringBuffer sb=new StringBuffer("update student set ");
            List params=new ArrayList();
            if(!TextUtils.isEmpty(phone)){
                sb.append("phone=?,");
                params.add(phone);
            }
            if(!TextUtils.isEmpty(name)){
                sb.append("name=?,");
                params.add(name);
            }
            if(!TextUtils.isEmpty(gender)){
                sb.append("gender=?,");
                params.add(gender);
            }
            if (params.size()!=0){
                //更新操作拼接字符串末尾有一个","需要去除
                //删除最后一位的“,”
                sb.setLength(sb.length()-1);
                sb.append(" where 1=1");
                //通过id指定 更新那行数据
                if(!TextUtils.isEmpty(id)){
                    sb.append(" and _id=?");
                    params.add(id);
                }else{
                    Toast.makeText(this,"请填写id",Toast.LENGTH_SHORT).show();
                    return;
                }
                SQLiteDatabase db=helper.getWritableDatabase();
                Object [] o=new Object[params.size()];
                params.toArray(o);//将数据存放到指定的数组中
                db.execSQL(sb.toString(),o);
            }
        }
    ContentValues cv = new ContentValues();//实例化ContentValues
    cv.put("name","123");//添加要更改的字段及内容
    String whereClause = "phone=?";//修改条件
    String[] whereArgs = {"12312313213"};//修改条件的参数
    db.update("student",cv,whereClause,whereArgs);//执行修改

    删除

       private void delete() {
            getAllText();
            //拼接sql语句
            StringBuffer sb=new StringBuffer("delete from student where 1=1");
            //保存参数的list
            List params=new ArrayList();
            //判断条件  动态拼接
            if(!TextUtils.isEmpty(id)){
                sb.append(" and _id=?");
                params.add(id);
            }
            if(!TextUtils.isEmpty(phone)){
                sb.append(" and phone=?");
                params.add(phone);
            }
            if(!TextUtils.isEmpty(name)){
                sb.append(" and name=?");
                params.add(name);
            }
            if(!TextUtils.isEmpty(gender)){
                sb.append(" and gender=?");
                params.add(gender);
            }
            SQLiteDatabase db=helper.getWritableDatabase();
            if (params.size()!=0){
                Object [] o=new Object[params.size()];
                params.toArray(o);//将数据存放到指定的数组中
                //执行删除
                db.execSQL(sb.toString(),o);
            }else{
                db.execSQL(sb.toString());
            }
            Toast.makeText(this,"删除完成",Toast.LENGTH_SHORT).show();
        }
    String whereClause = "name=?";//删除的条件
    String[] whereArgs = {"123"};//删除的条件参数
    db.delete("student",whereClause,whereArgs);//执行删除

    增加

      private void insert() {//保存数据到object数组
            Object [] o=new Object[]{name,phone,gender};
            //获取数据库操作对象
            SQLiteDatabase db=helper.getWritableDatabase();
            //sql:sql语句  bingArgs:参数数组
            db.execSQL("insert into student values(null,?,?,?)",o);
            //关闭连接
            db.close();
            Toast.makeText(this,"增加成功",Toast.LENGTH_SHORT).show();
        }
    ContentValues cv = new ContentValues();//实例化一个ContentValues用来装载待插入的数据
    cv.put("name","123"); 
    db.insert("student",null,cv);//执行插入操作
  • 相关阅读:
    FreeRTOS 移植到WIN10
    Keil debug command SAVE 命令保存文件的解析
    VS2017 编译 Visual Leak Detector + VLD 使用示例
    LaTeX 中插入GIF图片
    VS2017 + Qt5 + OpenCV400 环境配置
    记一次C++编程引用obj文件作为静态库文件
    Qt 多语言支持
    vscode 解决符号无法识别的问题
    带FIFO的UART数据接收
    MySQL Connector/Python 接口 (三)
  • 原文地址:https://www.cnblogs.com/r-decade/p/5870117.html
Copyright © 2020-2023  润新知