Android 中的数据库初始总结(SQLite部分)
Android 中的数据库初始总结(SQLite部分)
目录
使用
安卓中的数据库使用比较简单。
在安卓中,为了方便我们能够更好地管理数据库有一个类 SQLiteOpenHelper
,是用来操纵数据库的,可以更好地进行数据库的创建,更新,以及增删改查
其中 SQLiteOpenHelper
中有两个抽象的方法:
public void onCreate(SQLiteDatabase db)
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
这两个方法,我们必须重载,然后实现一些内容。
创建数据库方法 public void onCreate(SQLiteDatabase db)
该方法主要是用于数据库的创建。当我们软件刚刚安装的时候,没有数据库文件,这个时候我们就要进行数据库的创建。当创建完了之后,你可以在手机目录 /data/data/com.你的包名/databases
下面看到你的数据库文件,该文件以 .db
作为文件后缀名。
更新数据库方法 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)
我们用第一个就足够了。
构造方法 public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version)
该方法中,有5个参数
- 第一个参数是上下文,也就是上下文的调用者的实例,只要是访问功能和加载资源。
- 第二个参数是数据库的名称,用于定义数据库的名称
- 第三个参数允许我们再进行数据查询的时候,返回一个自定义的
Cursor
- 第四个参数便是版本
实例方法
在SQLiteOpenHelper中,还有两个实例方法:
getReadableDatabase()
getWritableDatabase()
这两个方法都可以创建或打开一个现有的数据库,并且返回一个可对数据库进行读写操作的对象。如果数据库存在,那么打开,如果不存在,那么创建。
其中,getReadableDatabase()
方法,在磁盘空间满的时候,用只读的方式去打开数据库,而 getWritableDatabase()
方法,则会出现异常。
创建数据库
好了,到这里,我们就基本上理解了一些最为基础的内容,下面便进行数据库的创建讲解
如何创建?
非常简单,你只需要在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)
这样,数据库就创建成功了,就可以进行增删改查操作了
增
创建了数据库,如果往数据库里面添加东西呢?这个时候需要利用两个类SQLiteDatabase
和ContentValues
这两个类。
首先我们定义一个SQLiteDatabase
对象,SQLiteDatabase db;
,然后,使用之前创建的dbHelper
去返回一个SQLiteDatabase
对象,也就是调用getWritableDatabase()
方法,然后创建一个ContentValues
对象,把一些数据放进去之后,便调用SQLiteDatabase
实例的insert()
方法进行插入。
SQLiteDatabase db=dbHelper.getWritableDatabase(); //然后使用contentValue进行数据封装 ContentValues values=new ContentValues(); values.put("表项",表项对应的值); db.insert("表名",null,values);
就这样,就可以进行数据库的插入了
删
删除数据库中的内容更加简单,只需要调用SQLiteDatabase
对象的delete()
方法,那边可以进行删除
SQLiteDatabase db=dbHelper.getWritableDatabase(); //删除内容 db.delete("表名","删除规则?",?所对应的值); //例如 db.delete("Book","pages>?",new String[]{"500"}); //删除Book表中,页数大于500的书籍
改
进行数据库的内容更改,需要使用到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"});
查
数据库的查询方式有很多,我指的是数据库的查询语句。这里只说一个方式。
在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" ); */
这样查询,即可
参考《第一行代码Android 第二版》
借鉴https://www.iteye.com/blog/notfatboy-653357
中的部分内容
如果需要转载,请标明出处
https://www.cnblogs.com/Yunrui-blogs/p/13173244.html