文章将要实现的功能
开发一个app,在app中用SQLiteDatabase类创建sqlite数据库StudentSystem,创建数据表Course,数据字段如下:
字段名 | 数据类型 | 描述 |
---|---|---|
id | integer | 主键,自动增长 |
course_no | varchar | 课程编号 |
course_name | varchar | 课程名称 |
credit | integer | 课程学分 |
remark | varchar | 课程描述 |
完成要求:
1、添加按钮。点击此按钮会弹出添加页面,添加页面里可以填写要添加的课程信息,填写完成点击“完成”时要用消息提示框显示是否添加成功。
2、查询按钮。点击此按钮可以按输入的课程名进行查询,如果不输入,则默认查询所有课程,把课程信息显示在页面的列表控件中。
Android下可以存放数据,读取数据,方法很多:
1、使用SharedPreferences类
- 可以快速保存java基本类型的变量中的数据。
- 数据都以键值对的形式存放于指定的xml文件中。
- 保存数据的xml文件存放在应用程序的私有数据文件夹中。
- 一般用于保存应用的一些基本配置信息。
- SharedPreferences数据是以XML文件的形式保存于系统的/data/data/<应用程序包名>/shared_prefs目录。
- 可以跨程序访问其他程序的SharedPreferences
2、SDcard
Java提供了一套完备的文件I/O类用于实现对文件系统的操作与管理
对SD卡上的文件操作基本步骤如下:
- 获取SD卡的访问权限
- 查看SD卡是否可用
调用Environment的getExternalStorageState()方法来判断SD卡是否可用:
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) - 获取SD的路径
调用Environment的getExternalStorageDirectory()方法获取SD卡的路径。 - 操作SD卡里的文件
借助于Java的I/O体系实现对SD卡文件的操作。
3、SQlite数据库
SQLite数据库是Android系统内置的一款轻量级开源嵌入式数据库。它支持大多数的SQL92标准,并且可以在所有主流的操作系统上运行。
SQLite数据库实现自包容、零配置、无服务、支持事务的
SQL数据库引擎
其特点是高度便携、使用方便、结构紧凑、高效、可靠。
保存路径:
创建或打开一个数据库文件,得到数据库对象db:
一般用一般用当前软件包的数据文件夹来存放数据库文件:
SQLiteOpenHelper
1、使用SQLiteOpenHelper 的好处
(1)对Sqlite的操作进行了封装,使用更简洁
(2)为app发布后升级数据库提供了方法
2、创建一个类继承SQLiteOpenHelper类,并重写该类的onCreate()和onUpgrade()方法
public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper (Context context, String name, int version) {
super(context, name,null,version);
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建数据库表
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//版本升级时维护数据库表
}
}
3、SQLiteOpenHelper打开数据库,不会自动创建,要用getReadableDatabase ()和getWritableDatabase ()获取一个用于操作数据库的SQLiteDatabase实例。
区别:
- getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。
- getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。
介绍得差不多了,下面就来实操代码
1、看一下目录结构
2、创建一个MyDbHelper继承SQLiteOpenHelper类
public class MyDbHelper extends SQLiteOpenHelper {
//用于创建数据库
public MyDbHelper(Context context) {
super(context,"StudentSystem.db",null,1);//版本为1
}
//数据库第一次被创建时调用,创建表
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
//初始化表结构
String sql="create table Course(id integer primary key autoincrement," +
"course_no varchar(100) not null," +
"course_name varchar(100) not null," +
"credit integer not null," +
"remark varchar(100) not null)";
//创建数据库表
db.execSQL(sql);
}
//当数据库更新调用,(数据库版本更新,增加表,修改)
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
Log.i("info","数据库更新,no peration");
}
}
3、创建一个CourseDao来执行crud操作
public class CourseDao {
//定义DbHelper帮助类
private MyDbHelper helper;
//context调用DbHelper
public CourseDao(Context context){
//初始化DbHelper
helper=new MyDbHelper(context);
}
//增加课程信息,返回值:主键:编号
public long insert(Course course){
//增加一条个人信息记录
long id=0;
//创建数据库操作对象
SQLiteDatabase db=null;
try {
//创建数据库操作对象
db = helper.getWritableDatabase();
//封装数据(Map(key,value))
ContentValues values = new ContentValues();
values.put("course_no",course.getCourse_no() );
values.put("course_name", course.getCourse_name());
values.put("credit", course.getCredit());
values.put("remark", course.getRemark());
id = db.insert("Course", null, values);
} catch (Exception e) {
// TODO: handle exception
}finally{
if(db!=null){
//关闭数据库
db.close();
}
}
return id;
}
//查询课程信息列表
public List queryByName(String course_name){
List plist=new ArrayList();
//创建数据库操作对象
SQLiteDatabase db=null;
try {
db=helper.getReadableDatabase();
//模糊查询
Cursor cursor=db.query("Course",null,"course_name like ?",new String[]{"%"+course_name+"%"},null,null,null);
//循环取出数据
while(cursor.moveToNext()){
//取数据
int id=cursor.getInt(cursor.getColumnIndex("id"));
String course_no=cursor.getString(cursor.getColumnIndex("course_no"));
//根据列名来查询
String pcourse_name=cursor.getString(cursor.getColumnIndex("course_name"));
int credit=cursor.getInt(cursor.getColumnIndex("credit"));
String remark=cursor.getString(cursor.getColumnIndex("remark"));
//封装到个人对象中
Course course=new Course(id,course_no,pcourse_name,credit,remark);
//个人对象加入集合中
plist.add(course);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(db!=null){
//关闭数据库
db.close();
}
}
return plist;
}
}
4、创建一个Course实体类
//课程信息实体类
public class Course {
private int id;
private String course_no;
private String course_name;
private int credit ;
private String remark;
public Course(){
}
//这里自己定义2个有参方法,方便后面调用
public Course(String course_no,String course_name,int credit,String remark){
this.course_no=course_no;
this.course_name=course_name;
this.credit=credit;
this.remark=remark;
}
public Course(int id,String course_no,String course_name,int credit,String remark){
this.id=id;
this.course_no=course_no;
this.course_name=course_name;
this.credit=credit;
this.remark=remark;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCourse_no() {
return course_no;
}
public void setCourse_no(String course_no) {
this.course_no = course_no;
}
public String getCourse_name() {
return course_name;
}
public void setCourse_name(String course_name) {
this.course_name = course_name;
}
public int getCredit() {
return credit;
}
public void setCredit(int credit) {
this.credit = credit;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
}
5、编写界面
activity_main.xml主界面截图:
增加课程界面activity_add.xml:
ListView视图每列界面:
6、增加课程的activity代码(AddActivity.java):
public class AddActivity extends Activity {
Button addmianbt1,addbackmain1;
EditText addmained1,addmained2,addmained3,addmained4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
addmianbt1=(Button)findViewById(R.id.addmainbt1);
addbackmain1=(Button)findViewById(R.id.addbackmain1);
addmained1=(EditText)findViewById(R.id.addmained1);
addmained2=(EditText)findViewById(R.id.addmained2);
addmained3=(EditText)findViewById(R.id.addmained3);
addmained4=(EditText)findViewById(R.id.addmained4);
//完成添加按钮,添加成功后弹出提示信息
addmianbt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String course_no =addmained1.getText().toString();
String course_name =addmained2.getText().toString();
int credit =Integer.parseInt(addmained3.getText().toString());
String remark =addmained4.getText().toString();
//封装课程信息类
Course course=new Course(course_no,course_name,credit,remark);
//新建数据库操作类
CourseDao pdao=new CourseDao(getApplicationContext());
long id=pdao.insert(course);
//Log.i("info",course_no+"--"+id+"--"+course_name);
Log.i("info", id+"");
if(id==0){
Toast.makeText(getApplicationContext(),"添加失败", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(getApplicationContext(),"课程 : "+course_name+" ,添加成功", Toast.LENGTH_LONG).show();
}
}
});
//返回主界面按钮
addbackmain1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent it=new Intent(AddActivity.this,MainActivity.class);
startActivity(it);
}
});
}
7、主activity代码(MainActivity.java):
public class MainActivity extends Activity {
ListView lv;
Button addbt1,seabt1;
EditText seaed1;
List plist;
CourseDao pdao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=(ListView)findViewById(R.id.listView1);
addbt1=(Button)findViewById(R.id.addbt1);
seabt1=(Button)findViewById(R.id.seabt1);
seaed1=(EditText)findViewById(R.id.seaed1);
//初始化界面
pdao=new CourseDao(getApplicationContext());
plist=pdao.queryByName("");
//新建适配器
MyAdapter adapter=new MyAdapter();
lv.setAdapter(adapter);
//跳转到添加课程信息界面
addbt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent(MainActivity.this,AddActivity.class);
startActivity(intent);
}
});
//查询按钮,根据输入的课程名进行模糊查询,若没有输入则显示所有课程
seabt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String course_name=seaed1.getText().toString();
//新建数据库操作类
CourseDao pdao=new CourseDao(getApplicationContext());
//List plist=pdao.queryByName(course_name);
plist=pdao.queryByName(course_name);
MyAdapter adapter=new MyAdapter();
lv.setAdapter(adapter);
//循环输出
for(int i=0;i<plist.size();i++){
//取出个人信息
Course course=(Course)plist.get(i);
}
}
});
}
//设置适配器
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return plist.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return plist.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View v=View.inflate(getApplicationContext(), R.layout.seaname, null);
//获取数据项视图
TextView course_id=(TextView)v.findViewById(R.id.lvtv11);//编号
TextView course_no=(TextView)v.findViewById(R.id.lvtv12);
TextView course_name =(TextView)v.findViewById(R.id.lvtv13);
TextView credit =(TextView)v.findViewById(R.id.lvtv14);
TextView remark=(TextView)v.findViewById(R.id.lvtv15);
Course course=(Course)plist.get(position);
//设置列表项的值
course_id.setText(course.getId()+"");
course_no.setText(course.getCourse_no());
course_name.setText(course.getCourse_name());
credit.setText(course.getCredit()+"");
remark.setText(course.getRemark());
return v;
}
}
}
到现在为止,整个要求就达到了,现在来跑一遍
添加课程:
现在来看一下界面:
主列表里面已经存在了,说明对数据库的操作已经成功了,增加功能具备
查询语句是模糊查询:
这个项目就已经达到上面的要求了,至于修改和删除操作也是一样的道理,会后续更新,其实可以不用借助Course实体类,可以自己用数组的方式来循环取数据。