zoukankan      html  css  js  c++  java
  • Android 中的数据库初始总结(SQLite部分)

    Android 中的数据库初始总结(SQLite部分)

    目录

    使用

    安卓中的数据库使用比较简单。

    在安卓中,为了方便我们能够更好地管理数据库有一个类 SQLiteOpenHelper,是用来操纵数据库的,可以更好地进行数据库的创建,更新,以及增删改查

    其中 SQLiteOpenHelper 中有两个抽象的方法:

    • public void onCreate(SQLiteDatabase db)
    • public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

    这两个方法,我们必须重载,然后实现一些内容。

    back

    创建数据库方法 public void onCreate(SQLiteDatabase db)

    该方法主要是用于数据库的创建。当我们软件刚刚安装的时候,没有数据库文件,这个时候我们就要进行数据库的创建。当创建完了之后,你可以在手机目录 /data/data/com.你的包名/databases 下面看到你的数据库文件,该文件以 .db 作为文件后缀名。

    back

    更新数据库方法 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

    这个方法主要是用于数据库的更新,oldVersion 必须比 newVersion 小,可以用于添加表或者其他的操作。

    重写方法讲解到这里就结束了,接下来我们讲讲其他的内容。

    SQLiteOpenHelper中有两个构造方法可以重写的,一个是:

    • 构造方法1 public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version)
    • 构造方法2 public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version, @Nullable DatabaseErrorHandler errorHandler)

    我们用第一个就足够了。

    back

    构造方法 public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version)

    该方法中,有5个参数

    • 第一个参数是上下文,也就是上下文的调用者的实例,只要是访问功能和加载资源。
    • 第二个参数是数据库的名称,用于定义数据库的名称
    • 第三个参数允许我们再进行数据查询的时候,返回一个自定义的Cursor
    • 第四个参数便是版本

    back

    实例方法

    在SQLiteOpenHelper中,还有两个实例方法:

    • getReadableDatabase()
    • getWritableDatabase()

    这两个方法都可以创建或打开一个现有的数据库,并且返回一个可对数据库进行读写操作的对象。如果数据库存在,那么打开,如果不存在,那么创建。

    其中,getReadableDatabase() 方法,在磁盘空间满的时候,用只读的方式去打开数据库,而 getWritableDatabase() 方法,则会出现异常。

    back

    创建数据库

    好了,到这里,我们就基本上理解了一些最为基础的内容,下面便进行数据库的创建讲解

    如何创建?

    非常简单,你只需要在onCreate()方法中书写就可以了:

    @Override
    public void onCreate(SQLiteDatabase db) {
    	db.execSQL( create_sql_sentence );
    }
    

    其中,create_sql_sentence 便是你所要创建的数据库的表的创建语句,比如我创建一个test表,表里面有一个id,有一个name,那么create_sql_sentence的内容便是:

    
    create table test(id integer primary key autoincrement, name text)
    
    

    这样,数据库就创建成功了,就可以进行增删改查操作了

    back

    创建了数据库,如果往数据库里面添加东西呢?这个时候需要利用两个类SQLiteDatabaseContentValues这两个类。

    首先我们定义一个SQLiteDatabase对象,SQLiteDatabase db;,然后,使用之前创建的dbHelper去返回一个SQLiteDatabase对象,也就是调用getWritableDatabase()方法,然后创建一个ContentValues对象,把一些数据放进去之后,便调用SQLiteDatabase实例的insert()方法进行插入。

    
    SQLiteDatabase db=dbHelper.getWritableDatabase();
    
    //然后使用contentValue进行数据封装
    ContentValues values=new ContentValues();
    values.put("表项",表项对应的值);
    db.insert("表名",null,values);
    
    

    就这样,就可以进行数据库的插入了

    back

    删除数据库中的内容更加简单,只需要调用SQLiteDatabase对象的delete()方法,那边可以进行删除

    
    SQLiteDatabase db=dbHelper.getWritableDatabase();
    //删除内容
    db.delete("表名","删除规则?",?所对应的值);
    //例如 db.delete("Book","pages>?",new String[]{"500"});
    //删除Book表中,页数大于500的书籍
    
    

    back

    进行数据库的内容更改,需要使用到ContentValue对象,然后把需要更改的值丢进ContentValue中,然后进行修改

    
    //获取SQLiteDatabase对象
    SQLiteDatabase db=dbHelper.getWritableDatabase();
    //封装
    ContentValues values=new ContentValues();
    values.put("表项",新的值);
    //更新数值
    //第三个参数对应SQL语句的where部分,第四个参数对应一个字符串数组
    //?是一个占位符,展位符的内容是new String[]{}对应的部分
    db.update("表名",values,"判定内容?",?所对应的占位);
    //例如这句话就是,把书名"The Da Vinci Code"对应的价格该为10.99
    //db.update("Book",values,"name=?",new String[]{"The Da Vinci Code"});
    
    

    back

    数据库的查询方式有很多,我指的是数据库的查询语句。这里只说一个方式。

    在SQLite中查询的时候,我们使用的是SQLiteDatabase的实例的一个方法,query()方法。

    这个方法的原型是:

    public Cursor query(String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having,String orderBy)

    • table:表名称
    • columns:列名称数组
    • selection:条件字句,相当于where
    • selectionArgs:条件字句,参数数组
    • groupBy:分组列
    • having:分组条件
    • orderBy:排序列
    • limit:分页查询限制

    可以看到,这个方法返回一个游标(Cursor),那么我们可以利用这个游标去访问我们的一些东西

    全部访问全部输出

    
    SQLiteDatabase db=dbHelper.getWritableDatabase();
    Cursor cursor=db.query("test",null,null,null,null,null,null);
    if(cursor.moveToNext()){
    	do{
    		int id=cursor.getString(cursor.getColumnIndex("id"));
    		String name=cursor.getString(cursor.getColumnIndex("name"));
    		Log.d("MainActivity","id: "+id);
    		Log.d("MainActivity","name: "+name);
    	}while(cursor.moveToNext());
    }
    cursor.close();
    
    
    

    这样,就可以进行查询了。如果需要特定的查询:

    借鉴一个网上的例子:

    有一个表,表名是Orders,内容如下:

    Id CustomerName OrderPrice Country OrderDate
    1 Arc 100 China 2010/1/2
    2 Bor 200 USA 2010/3/20
    3 Cut 500 Japan 2010/2/20
    4 Bor 300 USA 2010/3/2
    5 Arc 600 China 2010/3/25
    6 Doom 200 China 2010/3/26

    那么假设我们想查询客户总的订单数在500元以上的,且County在中国的客户的名称和订单总数,且按照CustomerName来排序,默认ASC排序。

    对应的SQL语句便是:

    
    SELECT  CustomerName,  SUM (OrderPrice)  FROM  Orders  WHERE  Country=?   GROUP   BY  CustomerName   HAVING   SUM (OrderPrice)>500  ORDER   BY  CustomerName
    
    

    而转换到SQLite中,便是:

    
    String table =  "Orders" ;  
    String[] columns = new  String[] { "CustomerName" ,  "SUM(OrderPrice)" };  
    String selection = "Country=?" ;  
    String[] selectionArgs = new  String[]{ "China" };  
    String groupBy = "CustomerName" ;  
    String having = "SUM(OrderPrice)>500" ;  
    String orderBy = "CustomerName" ;  
    Cursor c = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, null);
    
    /*
    
    Cursor c = db.query("Orders",
    		new String[]{"CustomerName","SUM(OrderPrice)"},
    		"Country=?",
    		new String[]{"China"},
    		"CustomerName",
    		"SUM(OrderPrice)>500",
    		"CustomerName"
       );
    
    */
    
    

    这样查询,即可

    back


    参考《第一行代码Android 第二版》
    借鉴https://www.iteye.com/blog/notfatboy-653357中的部分内容

    如果需要转载,请标明出处

    https://www.cnblogs.com/Yunrui-blogs/p/13173244.html

    这是小睿的博客,如果需要转载,请标注出处啦~ヾ(≧▽≦*)o谢谢。
  • 相关阅读:
    14_java之变量|参数|返回值|修饰符
    NYOJ 202 红黑树 (二叉树)
    NYOJ 138 找球号(二) (哈希)
    NYOJ 136 等式 (哈希)
    NYOJ 133 子序列 (离散化)
    NYOJ 129 树的判定 (并查集)
    NYOJ 117 求逆序数 (树状数组)
    NYOJ 93 汉诺塔 (数学)
    HDU 2050 折线分割平面 (数学)
    天梯赛L2-008 最长对称子串 (字符串处理)
  • 原文地址:https://www.cnblogs.com/Yunrui-blogs/p/13173244.html
Copyright © 2011-2022 走看看