Android--SQLite数据库操作(两种方式)

目录

 

一、使用SQLiteOpenHelper操作数据库

  1、数据库的创建:

        2、升级数据库:

        2、创建/拿到数据库对象:

           3、增删改查CRUD

            添加数据(insert):

            修改数据(upgrade):

            删除数据(delete):

            查询数据(query):

       注意:

        最后:如果想直接用SQL干的话,看下面--》

二、使用LitePal操作数据库

    1、配置:

    2、右击app/src/main目录-》New-》Directory,创建一个assets目录,闯进一个litepal.xml文件

    4、升级数据库

    5、新增数据(save)

    6、更新数据

 7、删除数据

    8、查询数据

    9、如果要使用原生态的SQL则需要百度以下哈,这里就先不总结了

最后总结:


一、使用SQLiteOpenHelper操作数据库

        SQLite数据库支持:INTEGER , REAL(浮点型) , TEXT(字符串文本),NULL(零)五种数据类型 
        ---------------------------------------

  1、数据库的创建:

            public class MyHelper extends SQLiteOpenHelper{
                public MyHelper(Context context){
                    super(context,"数据库名.db",null,1);
                }
                //仅在第一次创建DB时调用,之后更新数据库时,可以调用onCreate()
                public void onCreate(SQLiteDatabase db){
                    db.execSQL("建表SQL");
                }
                public void onUpgrade(SQLiteDatabase db , int oldVersion,int newVersion){
                    //db.exeSQL();
                    //db.exeSQL();
                    //onCreate(db);
                }
            }
        ---------------------------------------

        2、升级数据库:

                1)在onUpdate()方法中执行DROP语句,把所有已存在的表删除掉,
                    然后再次调用onCreate()方法重新创建数据库【注意如果没把已经存在的表
                    删除掉,再创建表时系统会发现此张表已经存在,就会直接报错】
                    例子:
                        public static final String CREATE_ BOOK = "create table Book ("
                            + "id integer primary key autoincrement,
                            + "author text,
                            + "price real, 
                            + "pages integer,
                            +"nametext)";
                        public static final String CREATE_ CATEGORY = "create table Category ("
                            + "id integer primary key autoincrement,
                            + "category_ name text, "
                            + "category_ code integer)";

                        public void onUpgrade(){
                            db.execSQL("drop table if exists Book");
                            db.execSQL("drop table if exists Category");
                            onCreate(db);
                        }
                2)如何让onUpgrade()方法得到执行?
                    通过SQLiteOpenHelper的构造方法里的第四个参数【当前数据库的版本号】
                    之前我们传递的是1,现在我们传递一个1大的数,就可以然onUpgrade()方法执行了
                    举例:
                        dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,2);//拿到对象
                        dbHelper.getWritableDatabase();//创建和升级数据库
        ---------------------------------------

        2、创建/拿到数据库对象:

                SQLiteOpenHelper中还有两个非常重要的实例方法: getReadableDatabase()和 get-
            WritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已在在则
            直接打开,否刚创建一个新的数据库)并返回一个可对数据库进行读写操作的对象。
                不同的是,当数据库不可写人的时候(如磁盘空间已满), getReadableDatabase()方法返回的对象将以只
            读的方式去打开数据库,面getWritableDatabase()方法则将出现异常。
        ---------------------------------------

           3、增删改查CRUD

            要点:
                    SqlLiteOpenHelper的getReadableDatabase()和getWritableDatabase()方法会返回一个SQLiteDatabase对象,
                借助这个对象做数据的CRUD操作。

            添加数据(insert):

                SQLiteDatabase db=helper.getWritableDatabase();
                //创建ContentValue对象,提供了一系列的put方法
                ContentValues values = new ContentValues();
                values.put("name",“zz");
                values.put("price",26);
                //参数:表名,未指定添加数据的列自动赋的值,ContentValue对象
                db.insert("表名",null,values);
                db.close();

            修改数据(upgrade):

                SQLiteDatabase db=helper.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put("price",26);
                //参数:表名,ContentValue对象,更新那些行,约束条件【不指定第3,4个参数,默认所有行】
                db.update("表名",values,"name=?",new String[]{"zzl"});
                db.close();


            删除数据(delete):


                SQLiteDatabase db=helper.getWritableDatabase();
                //参数:表名,删除那些行,约束条件【不指定2,3参数,默认删除所有行】
                db.delete("表名",”name=?“,new String[]{"zzl"});
                db.close();

            查询数据(query):

                SQLiteDatabase db=helper.getWritableDatabase();
                //参数:看书吧!挺多的【这里建议直接写SQL清楚】
                //返回一个Cursor对象,查询到的所有数据都将从Cursor对象中取出
                Cursor cursor = db.query("表名",name,"name=?",new String[]{},null,null,null);
                if(cursor.moveToFirst()){//将数据指针移动到首行位置
                    do{
                        //getColumnIndex()方法获取某一列在表中对应位置的索引,传入到取值方法中
                        
                        //取String型数据
                        String name = cursor.getString(cursor.getColumnIndex("name");
                        //取Int型数据
                        int price = cursor.getInt(cursor.getColumnIndex("price");
                        //取double型数据
                        double age = cursor.getDouble(cursor.getColumnIndex("age:);
                    }while(cursor.moveToNext())//
                }
                //关闭cursor
                cursor.close();
                db.close();
        --------------------------------------

       注意:

进行增删改查操作时,都需要SQLiteDatabase对象,所以要在对数据库访问完后,再close掉这个对象,不然期间还需要再           重新拿对象

        ----------------------------------

        最后:如果想直接用SQL干的话,看下面--》

            添加数据:
                db.exeSQL("insert into Book(name,author,pages,price) values(?,?,?,?) new String[]{"三国演义","罗贯中","166",“16.6”}");
            更新数据:
                db.exeSQL("update Book set price=? where name=?" new String[]{"26.3","飞虎传"});
            删除数据:
                db.exeSQL(“delete from Book where pages>?”,new String[]{"500"});
            查询数据:
                db.rawQuery("select * from Book",null);

二、使用LitePal操作数据库

    介绍:LitePal是一个开源库,采用了对象关系映射模式,
    特点:不用编写SQL语句,对CURD进行了封装,集成了:建表,CRUD操作

    1、配置:

        dependencies:
            implementation 'org.litepal.android:core:1.6.1'
        AndroidManifest.xml:
         <application
            android:name="org.litepal.LitePalApplication"
            ...>

    2、右击app/src/main目录-》New-》Directory,创建一个assets目录,闯进一个litepal.xml文件

        编辑litepal.xml文件内容:
            <?xml version="1.0" encoding="utf-8"?>
            <litepal>
                //数据库名
                <dbname value="cool_weather"/>
                //版本号【建议从1开始,这里由于调试了两次程序,所以增到了3】
                <version value="3"/>
                //所有表的映射模型【一定要用完整的类名】
                <list>
                <mapping class="com.coolweather.android.db.province"/>
                <mapping class="com.coolweather.android.db.city"/>
                <mapping class="com.coolweather.android.db.county"/>
                </list>
            </litepal>

    4、升级数据库

        由于LitePal采用ORM模式,也就是对象关系映射,就是用面向对象的思维来操作数据库
        1)所有的表,都需要新建模型类,继承DataSupport类【之后所有的CRUD的方法都是从DataSupport继承来】
            2)   若需要该现有表的结构,就直接修改对应的模型类的域属性
        3)若新增表,就直接新建模型类,然后将它添加到映射模型列表中

    5、新增数据(save)

        1)创建模型类实例对象,调用setxxx()方法对数据进行设置
        2)实例对象调用save()方法完成添加操作

    6、更新数据

        //之前的SQLOpenHelper方法,是直接删除掉所有的表重新创建,这是十分不推荐的
        第一种:可以新建实例对象,调用set方法,再次调用save方法对原有的数据项进行重写
        第二种:举例:
            Book book = new Book();
            book.setPrice(14.95);//价格
            book.setPress("Anchor");//出版社
            book.setTODefalut("pages");//pages字段的值更新为默认值
            book.updataAll("name=? and author=?","三国演义,"罗贯中");

 7、删除数据

        举例:
            DataSupport.deleteAll(Book.class,"price<?","15");
            如果不指定约束条件,就删除表中所有数据,这一点和updateAll一样

    8、查询数据

        //之前之前的SQLOpenHelper方法,会出现query("book",null,null,null,...)一大堆null,会让人头疼
        //但是也不得不传null
        使用Litepal查询:DataSupport.findAll(Book.class);返回值是List集合,也就是不用通过Cursor对象,一行行
        地取值了,litepal自动帮我们完成了赋值操作
        补充:
            * 查询第一条数据:findFirst(Book.class);
            * 查询最后一条数据:findLast(Book.class);
        通过连缀查询定制查询功能:
            * 查询哪几列的数据select("name","author","pages")
            * 新增约束条件where("pages>?","400")
            * 指定结果排序方式order("pages desc")   //写asc或者不写表示升序排列
            * 指定结果数量limit(10)
            * 指定查询结果的偏移量offset(10)
            以下大妈表示:查询Book表中第11~20条满足:页数>400这个条件的name,author和pages这3列数据,并将结果按pages升排列
            List<Book> books = DataSupport.select("name","author","pages")
                                        .where("pages>?","400")
                                        .order("pages")
                                        .limit(10)
                                        .offset(10)
                                       .find(Book.class);

    9、如果要使用原生态的SQL则需要百度以下哈,这里就先不总结了

-------------------------------

最后总结:

    还是推荐使用LitePal方式,为什么啊?
        - 该表结构,增加表很容易
        - 我们不需要写建表SQL呀!
        - CRUD都有了很好的封装【尤其是查询】


 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值