Android下SQLite数据库借助SQLiteOpenHelper操作

文章将要实现的功能

开发一个app,在app中用SQLiteDatabase类创建sqlite数据库StudentSystem,创建数据表Course,数据字段如下:

字段名 数据类型 描述
id integer 主键,自动增长
course_no varchar 课程编号
course_name varchar 课程名称
credit integer 课程学分
remark varchar 课程描述

完成要求:
1、添加按钮。点击此按钮会弹出添加页面,添加页面里可以填写要添加的课程信息,填写完成点击“完成”时要用消息提示框显示是否添加成功。
2、查询按钮。点击此按钮可以按输入的课程名进行查询,如果不输入,则默认查询所有课程,把课程信息显示在页面的列表控件中。

Android下可以存放数据,读取数据,方法很多:

1、使用SharedPreferences类

  1. 可以快速保存java基本类型的变量中的数据。
  2. 数据都以键值对的形式存放于指定的xml文件中。
  3. 保存数据的xml文件存放在应用程序的私有数据文件夹中。
  4. 一般用于保存应用的一些基本配置信息。
  5. SharedPreferences数据是以XML文件的形式保存于系统的/data/data/<应用程序包名>/shared_prefs目录。
  6. 可以跨程序访问其他程序的SharedPreferences

2、SDcard
Java提供了一套完备的文件I/O类用于实现对文件系统的操作与管理
对SD卡上的文件操作基本步骤如下:

  1. 获取SD卡的访问权限
    在这里插入图片描述
  2. 查看SD卡是否可用
    调用Environment的getExternalStorageState()方法来判断SD卡是否可用:
    Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
  3. 获取SD的路径
    调用Environment的getExternalStorageDirectory()方法获取SD卡的路径。
  4. 操作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实例。
区别:

  1. getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。
  2. 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实体类,可以自己用数组的方式来循环取数据。

发布了2 篇原创文章 · 获赞 4 · 访问量 157

猜你喜欢

转载自blog.csdn.net/SanSuiBuSha/article/details/105595405