zoukankan      html  css  js  c++  java
  • Sqlite 数据库的增删改查

    SQLite 是一个轻量级的数据库,支持SQL正规的SQL语句,可以存储大量数据。

    建立SQLite数据库,要使用Android提供的一个SQLiteOpenHelper帮助类,需要新建一个类去继承SQLiteOpenHelper类,重写里面的两个抽象方法,OnCreate()和OnUpgrade(),还要重写有产构造方法,

    有参构造重写四个参数的,第一个参数是上下文,第二个是数据库名称,第三个是游标Cursor,通常给值null,第四个是当亲数据库的版本号。

    public 重写方法(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
            MyDatabaseHelper.this.context = context;
        }

    onCreate()方法,调用SQLiteDatabase 对象的execSQL()方法,里面的参数是建表的SQL语句,

    private String sql = "create table Book("
                +"id integer primary Key autoincrement,"
                +"author text,"
                +"price real,"
                +"pages integer,"
                +"name text)";
     @Override
        public void onCreate(SQLiteDatabase sqLiteDatabase) {
            sqLiteDatabase.execSQL(sql);
        }

    然后在主活动中new一个继承SQLiteOpenHelper类的对象,并且调用getWritableDatabase()或getReadableDatabase()方法。这两者都可以创建一个数据库,或者数据库存在就直接打开,但是当数据库不可写入的时候,getReaderDatabase()方法会以只读的方式打开数据库,getWritableDatabase()方法则会出现异常。

    在创建数据库的时候调用的getReaderDatabase() 或getWritableDatabase()会返回一个SQLiteDatabase对象,利用该对象调用相应的方法完成数据的增删改查

    增加数据:

      可以分为两种方式:

      1:new一个ContentValues,该对象提供Put()方法,数据以键值对的形式储存,SQLiteDatabase对象  ,提供一个insert()方法,它接受三个参数,第一是表名,第二是在未给指定列赋值时,默认为null,第三就是ContentValues对象。

      2:就是调用SQLiteDatabase对象 的execSQL()方法,里面传值SQL语句。

      /* ContentValues values = new ContentValues();
                        values.put("author","周生磊");
                        values.put("price",22);
                        values.put("pages",33);
                        values.put("name","android");
                        db.insert("Book",null,values);
                        values.clear();*/
                        db.execSQL("insert into Book(author,price,pages,name) values(?,?,?,?)",new String[]{"周生磊","22","33","android"});

    删除数据:

      1.同上调用delete()方法。第一个参数表名,第二个限定条件,第三个限定条件的值。

      2:同上

     /* db.delete("book","name=?",new String[]{"android"});*/
                        db.execSQL("delete from book where name = ?",new String[]{"android"});

    修改数据:

      1:同上,new 一个ContentValues对象,用来存放数据,SQLiteDatabase对象调用updata()方法,传入四个参数,第一个表名,第二个需要修改的数据,第三个限定符,表示要修改哪一行等待传值,第四个传值具体修改哪几行。

      2:SQLiteDatabase对象的execSQL()方法,写入SQL语句。

     /*ContentValues values1 = new ContentValues();
                        values1.put("price",5435);
                        db.update("book",values1,"name=?",new String[]{"android"});*/
                        db.execSQL("update Book set price = ? where name =?",new String[]{"4533","android"});

    查询数据:最复杂的

      1:查询数据需要调用rawQuery()方法,该方法返回值是一个Cursor(游标),利用Cursor遍历查询结果,首先确认cursor是否为空,调用cursor.moveToFirst(),该方法移动Cursor到第一行,如果为空就返回False,否则就是true,在进行循环进行遍历,利用Cursor.GetString(),方法得到该列的具体参数,看到下面代码很多人会疑问,为什么不在.GetString(),方法内直接传入列名,而是又调用了一个Cursor.GetColumnIndex()呢?那是应为.GetString()方法内只接受Int类型的值,而.GetColumnIndex(),接受String值,返回int值,而GetColumnIndex()方法返回的int值是该列的下标,所以利用返回值得相互转变得到我们想要的数据值。简直完美,不是吗?

      2:调用的是RawQuery()方法,而不是execSQL()方法,里面写入SQL语句,查询全部则第二个限定参数为null,第二个参数类型为new String[]{}类型,用法同上一样,SQL语句?限定,new String[]{}里面给‘?‘赋值。

    /*Cursor cursor = db.query("book",null,null,null,null,null,null);*/
                        Cursor cursor = db.rawQuery("select * from Book",null);
                        if (cursor.moveToFirst()){
                            do {
                                //遍历Cursor对象,并打印
                                String author = cursor.getString(cursor.getColumnIndex("author"));
                                int price = cursor.getInt(cursor.getColumnIndex("price"));
                                int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                                String name = cursor.getString(cursor.getColumnIndex("name"));
                                String show = "author:"+author+",price:"+price+",pages:"+pages+",name:"+name;
                                et_show.setText(show);
                            }while (cursor.moveToNext());
                        }
  • 相关阅读:
    淘宝从几百到千万级并发的十四次架构演进之路!
    19 个强大、有趣、好玩、又装B的 Linux 命令!
    Spring Boot实战:拦截器与过滤器
    初识zookeeper,linux 安装配置zookeeper
    Spring-boot:5分钟整合Dubbo构建分布式服务
    Spring-Boot:6分钟掌握SpringBoot开发
    Dubbo的使用及原理浅析.
    Java消息队列--ActiveMq 初体验
    关于Ubuntu 常用的简单指令
    IBM、HPUX、Solaris不同之处
  • 原文地址:https://www.cnblogs.com/zhoushenglei/p/7153581.html
Copyright © 2011-2022 走看看