• 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谢谢。
  • 相关阅读:
    java ->IO流_打印流
    java ->IO流_序列化流与反序列化流
    java ->properties类
    java ->String、StringBuffer、StringBuilder三者之间的区别
    java-> 利用IO操作与递归实现目录的复制
    java
    java ->IO流_转换流
    java ->IO流_字符流
    java ->IO流_字节流
    死循环
  • 原文地址:https://www.cnblogs.com/Yunrui-blogs/p/13173244.html
Copyright © 2020-2023  润新知