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)

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

创建了数据库,如果往数据库里面添加东西呢?这个时候需要利用两个类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);

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

删除数据库中的内容更加简单,只需要调用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,内容如下:

IdCustomerNameOrderPriceCountryOrderDate
1Arc100China2010/1/2
2Bor200USA2010/3/20
3Cut500Japan2010/2/20
4Bor300USA2010/3/2
5Arc600China2010/3/25
6Doom200China2010/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