在我们学会了Android的基本使用之后就需要往高处发展了,毕竟水往高处流,很多时候我们学习一门技术感觉没有收获都是因为还没到那个层次,当你一步步往上走的时候就会渐渐发现自己收获的越来越多,进步也就会越来越快了,废话不多说,回到正题;
1、认识数据库
安卓中的数据库sqlite是一个微型的、跨平台和弱类型的数据库,他的体积很小,只有几百kb,我们可以再Android的SDK文件夹下面找到他:
其实和一些主流的数据库mysql 不太一样,他可以在一个列中存放不同的数据类型,但是它的sql语言是一样的;
在这个位置我们可以打开cmd,然后输入sqlite3,就可以执行一个命令行的数据库操作器,要注意的是他的一些命令是不一样的,跟其他的数据库比较起来,他创建或者打开数据库使用的是.open,在每一个关于数据库命令下面,都需要在前面加上一个点号,而在每一个sql命令下面都需要在后面加上一个分号;
.open StudentInfo
我记得sql server、MySQL打开数据库都是use 数据库名,但是这里不是这样的,而且这个小点不能忘了;还有很多的数据库命令,比如退出:
.exit
.quit
使用.table可以查看当前数据库下面的所有表;
pragma table_info(表名)
这个可以查看数据表结构;
对于sql语句的话相信大家都多多少少接触过了,这里我就不过多赘述;
在我们安装好了Android studio的时候其实就已经自带了这个数据库,他用来存放一些简单的数据还是没有问题的;
2、使用数据库
我们可以在网上下载一个sqlite的可视化工具可以看到数据库里面的表:
很多数据库都是拥有自己的可视化管理工具的,MySQL有navicat、sql server 有MMSM;
sqlite的就是sqlitestudio,安装好之后我们就只需要将我们创建的数据库拖动到这个程序里面他就会打开了:
· 创建帮助类
当然我们只用sqlitestudio是没有什么作用的,需要通过敲代码的方式实现数据的增删改查,Android提供了几个类来帮助我们实现这些操作:
我们主要就了解两个重要的类
1)、SQLiteOpenHelper
这是一个帮助抽象类,没有实例,我们可以通过继承的方式来实例化一个子类:
package com.example.apptest01;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class SqliteHelper extends SQLiteOpenHelper {
private String CREATE_TABLE_STUDENTINFI="CREATE TABLE Users(" +
"userId integer primary key AutoIncrement, userName text,age integer,passWord text)";
public SqliteHelper(Context context){
//参数:上下文、数据库名、工厂类、版本
super(context,"StudentInfo.db",null,1);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_TABLE_STUDENTINFI);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
这个子类需要创建数据库和继承父类的构造方法,首先需要写一个构造方法,将上下文传进去,super一下父类的构造方法,然后就是接口方法oncreate,在里面执行创建数据表的sql命令;
2)、SQLiteDatabase
这是sql实现增删改查的工具类,可以通过这个类下面的方法来实现sql操作,但是这个类需要通过帮助类get到:
sqliteHelper = new SqliteHelper(this);
sqLiteDatabasewriter = sqliteHelper.getWritableDatabase();
sqLiteDatabaseReader = sqliteHelper.getReadableDatabase();
//条件删除
sqLiteDatabasewriter.delete("Users","userId=?",new String[]{id+""});
//修改
sqLiteDatabasewriter.update("Users",contentValues,"userId=?",new String[]{cid});
//添加
sqLiteDatabasewriter.insert("Users",null,contentValues);
//查询
sqLiteDatabasewriter.query("Users",null,"userId=?",new String[]{arrayList.get(i)+""},
· 查询
那么我们知道了通过创建帮助类来创建执行类,然后使用执行类就可以实现数据的增删改查,这里我们先通过查询来讲解一下具体的实现过程:
cursor = sqLiteDatabasewriter.query("Users",null,"userId=?",new String[]{arrayList.get(i)+""},
null,null,null);
if(cursor.moveToNext()){
id = cursor.getInt(cursor.getColumnIndex("userId"));
name = cursor.getString(cursor.getColumnIndex("userName"));
pwd = cursor.getString(cursor.getColumnIndex("passWord"));
age = cursor.getInt(cursor.getColumnIndex("age"));
}
我们获取操作类的方法有两个,一个是reader一个是writer,这里既然是查询数据我们用reader就可以,当然使用writer也是无伤大雅;
使用query方法进行数据的查询,他有一些参数,第一个是表名,第二个列名,还是看这个明白一点:
有分组,分页,排序,筛选,很多参数,但是一般我们就是用到选项selection和表名就可以了;
他的返回值是一个cursor游标对象,相当于一个指针,可以通过while遍历的方式来获取到查询到的结果集;
关于cursor对象我们需要清楚他的两个方法,get类型() 和 getColumnIndex("列名"),前者的作用是通过后者的返回值实现查询到具体的数据,后者是通过列名查询到记录对应的索引,也就是说两者结合使用就可以实现查询到具体的数据,当然这个是需要咋while遍历里面实现的;
· 添加
添加数据同样结合这操作类的使用:
ContentValues contentValues = new ContentValues();;
contentValues.clear();
contentValues.put("userId",et_id.getText().toString());
contentValues.put("userName",et_name.getText().toString());
contentValues.put("passWord",et_password.getText().toString());
contentValues.put("age",et_age.getText().toString());
long result = sqLiteDatabasewriter.insert("Users",null,contentValues);
if(result == 1){
Toast.makeText(this,"记录完成",Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this,"记录失败",Toast.LENGTH_LONG).show();
}
showData();
arrayAdapter.notifyDataSetChanged();
这里又使用了一个新的对象,就是ContentValues 这个对象用于存放键值对,通过put方法,存放着与数据表中列名对应的数据,然后将其使用操作类的insert方法就可以将数据成功添加到数据表中了;
这里需要注意insert的三个参数,第一个是表名,第二个一般为null,第三个就是键值对数据了,这类统一使用contentvalues对象;
· 删除
删除操作也是结合这操作类使用:
sqLiteDatabasewriter.delete("Users","userId=?",new String[]{id+""});
这里要注意如何使用选项的问题whereClause其实就是条件,在sql里面对应的就是where,可以使用占位符?的方式,然后后面new String[]{}传参,也可以一步到位;
· 适配器复习
这里需要复习一下适配器,我们适配器是用来将数据显示到界面上的,那么当数据改变是我们如何刷新显示呢?
arrayAdapter.notifyDataSetChanged();
只需要调用一下这个方法,记住存放数据的对象可是一个全局变量;
我们大概使用到数据库的操作就这些,当然是使用的比较多的增删改查,为什么要使用适配器呢?
还记得之前我们讲过适配器吗,它是用来将数据显示到页面上的,因为我们从数据库中拿到数据之后终究是需要显示到页面上,所以数据库是必不可少的一个对象;