首页 > 代码库 > 安卓开发中SQLite的使用(附实例)

安卓开发中SQLite的使用(附实例)

   在Android平台上系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取。下面以我自己创建的收入信息表(InAccount)为例,来学习SQLite的使用。

      主要是四个步骤:

      1.创建数据库类,继承SQLiteOpenHelper。程序调用的包会自动导入。

public class DBOPenHelper extends SQLiteOpenHelper {/** 数据库版本号 */private static final int VERSION = 1;/** 数据库名称 */private static final String DBNAME="account.db";/** 重写构造函数 */public DBOPenHelper(Context context) {super(context, DBNAME, null, VERSION);// TODO Auto-generated constructor stub}@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stub// 创建收入信息表(ID,金额,时间,类型,备注)db.execSQL("create table InAccount(ID integer primary key,Money decimal,Time varchar(10),Type varchar(10),Marks varchar(200))");}@Overridepublic void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {// TODO Auto-generated method stub}}
View Code

      2.建立数据库表,定义各个字段变量以及set和get方法。

set方法和get方法自动生成(建立各个字段变量后)

/**存入收入信息*/public class TB_InAccount {/**存储收入编号*/private int ID;/**存储收入金额*/private double Money;/**存储收入时间*/private String Time;/**存储收入类型*/private String Type;/**存储输入备注信息*/private String Marks;/**默认构造函数*/public TB_InAccount() {// TODO Auto-generated constructor stubsuper();}/**自定义有参构造函数*/public TB_InAccount(int ID,double Money,String Time,String Type,String Marks){super();this.ID=ID;this.Money=Money;this.Time=Time;this.Type=Type;this.Marks=Marks;}//利用source生成下面的get和set方法(每一个变量两种方法)public int getID() {return ID;}public void setID(int iD) {ID = iD;}public double getMoney() {return Money;}public void setMoney(double money) {Money = money;}public String getTime() {return Time;}public void setTime(String time) {Time = time;}public String getType() {return Type;}public void setType(String type) {Type = type;}public String getMarks() {return Marks;}public void setMarks(String marks) {Marks = marks;}}
View Code

 

      3.创建数据库中对某一个表的操作的类。包括增、删、查、改。(这里可以只创建自己需要的方法,对应在activity中的功能)

/** 对InAccount表上的所有数据操作 */public class InAccountDB {/** 声明一个DBOPenHelper对象 */private DBOPenHelper helper;/** 声明一个SQLiteDatabase对象 */private SQLiteDatabase db;/** 自定义有参数构造方法 */public InAccountDB(Context context) {// 初始化helper对象helper = new DBOPenHelper(context);}/** 添加收入信息 */public void addInAccount(TB_InAccount tb_InAccount) {// 初始化db对象db = helper.getWritableDatabase();// SQL语句执行添加操作db.execSQL("insert into InAccount(ID,Money,Time,Type,Marks) values(?,?,?,?,?)",new Object[] { tb_InAccount.getID(), tb_InAccount.getMoney(),tb_InAccount.getTime(), tb_InAccount.getType(),tb_InAccount.getMarks() });}/** 更新收入信息 */public void updateInAccount(TB_InAccount tb_InAccount) {// 初始化db对象db = helper.getWritableDatabase();// SQL语句执行更新操作db.execSQL("update InAccount set Money=?,Time=?,Type=?,Marks=? where ID=?",new Object[] { tb_InAccount.getID(), tb_InAccount.getMoney(),tb_InAccount.getTime(), tb_InAccount.getType(),tb_InAccount.getMarks() });}/** 查询收入信息 */public TB_InAccount findInAccount(int ID) {// 初始化db对象db = helper.getWritableDatabase();// 初始化光标对象// 建议SQLite操作使用rawQuery方法// 参考http://www.pin5i.com/showtopic-sqlite-rawquery.html// 根据ID查询收入信息,存入Cursor类中Cursor cursor = db.rawQuery("select ID,Money,Time,Type,Marks from InAccount where _id = ?",new String[] { String.valueOf(ID) });if (cursor.moveToNext())// 遍历查找到的收入信息{// 将遍历到的收入信息存储到tb_InAccount类中return new TB_InAccount(cursor.getInt(cursor.getColumnIndex("ID")),cursor.getDouble(cursor.getColumnIndex("Money")),cursor.getString(cursor.getColumnIndex("Time")),cursor.getString(cursor.getColumnIndex("Type")),cursor.getString(cursor.getColumnIndex("Marks")));}return null;}/** 删除收入信息 */public void deleteInAccount(Integer[] IDs) {if (IDs.length > 0) {// 创建StringBuffer对象StringBuffer sb = new StringBuffer();// 遍历要删除的id集合for (int i = 0; i < IDs.length; i++) { // 将删除条件添加到StringBuffer对象中sb.append(‘?‘).append(‘,‘);}// 去掉最后一个“,“字符sb.deleteCharAt(sb.length() - 1);db = helper.getWritableDatabase();// 初始化SQLiteDatabase对象// 执行删除收入信息操作db.execSQL("delete from InAccount where ID in (" + sb + ")",(Object[]) IDs);}}/*** 获取收入信息* * @param start起始位置* @param count每页显示数量*/public List<TB_InAccount> getScrollData(int start, int count) {// 创建集合对象List<TB_InAccount> tb_InAccount = new ArrayList<TB_InAccount>();// 初始化SQLiteDatabase对象db = helper.getWritableDatabase();// 获取所有收入信息Cursor cursor = db.rawQuery("select * from InAccount limit ?,?",new String[] { String.valueOf(start), String.valueOf(count) });while (cursor.moveToNext())// 遍历所有的收入信息{// 将遍历到的收入信息添加到集合中tb_InAccount.add(new TB_InAccount(cursor.getInt(cursor.getColumnIndex("ID")), cursor.getDouble(cursor.getColumnIndex("Money")), cursor.getString(cursor.getColumnIndex("Time")), cursor.getString(cursor.getColumnIndex("Type")), cursor.getString(cursor.getColumnIndex("Marks"))));}// 返回收入信息表集合return tb_InAccount;}/** 获取收入信息表总记录数 */public long getCount() {// 初始化SQLiteDatabase对象db = helper.getWritableDatabase();// 获取收入信息的记录数Cursor cursor = db.rawQuery("select count(ID) from InAccount", null);// 判断Cursor中是否有数据if (cursor.moveToNext()) { // 返回总记录数return cursor.getLong(0);}// 如果没有数据,则返回0return 0;}/*** 获取收入信息表最大编号 */public int getMaxId() {// 初始化SQLiteDatabase对象db = helper.getWritableDatabase();// 获取收入信息表中的最大编号Cursor cursor = db.rawQuery("select max(ID) from InAccount", null);// 访问Cursor中的最后一条数据while (cursor.moveToLast()) {// 获取访问到的数据,即最大编号return cursor.getInt(0);}// 如果没有数据,则返回0return 0;}}
View Code

 

  4.在addactivity类中添加对数据表的操作,因为我建立的表的字段中有时间,所以把时间对话框的也添加进去了;也涉及到ListView控件的使用

public class AddInaccount extends Activity {// 创建日期对话框常量protected static final int DATE_DIALOG_ID = 0;// 创建4个EditText对象EditText txtInMoney, txtInTime, txtMarks;// 创建Spinner下拉列表Spinner spInType;// 保存按钮Button SaveBtn;// 取消按钮Button CancelBtn;// 年月日private int mYear;private int mMonth;private int mDay;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.addinaccount);// 初始化变量txtInMoney = (EditText) findViewById(R.id.txtInMoney);txtInTime = (EditText) findViewById(R.id.txtInTime);txtMarks = (EditText) findViewById(R.id.txtInMark);spInType = (Spinner) findViewById(R.id.spInType);SaveBtn = (Button) findViewById(R.id.btnInSave);CancelBtn = (Button) findViewById(R.id.btnInCancel);// 为时间文本框设置单击监听事件txtInTime.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// 显示日期选择对话框showDialog(DATE_DIALOG_ID);}});// 为保存按钮添加监听事件CancelBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stub// 设置金额文本框为空txtInMoney.setText("");// 为金额文本框设置提示txtInMoney.setHint("0.00");// 设置时间文本框为空txtInTime.setText("");// 为时间文本框设置提示txtInTime.setHint("2014-11-23");// 设置备注文本框为空txtMarks.setText("");// 设置类别下拉列表默认选择第一项(下拉框中的字符串信息存储在addinaccount.xml中)spInType.setSelection(0);}});// 为取消按钮添加监听事件SaveBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubString strInMoney = txtInMoney.getText().toString();// 获取金额文本框的值if (!strInMoney.isEmpty()) {// 判断金额不为空// 创建InAccountDB对象InAccountDB inaccountDB = new InAccountDB(AddInaccount.this);// 创建Tb_inaccount对象TB_InAccount InAccount = new TB_InAccount(inaccountDB.getMaxId() + 1, Double.parseDouble(strInMoney),txtInTime.getText().toString(), spInType.getSelectedItem().toString(), txtMarks.getText().toString());inaccountDB.addInAccount(InAccount);// 添加收入信息// 弹出信息提示Toast.makeText(AddInaccount.this, "〖新增收入〗数据添加成功!",Toast.LENGTH_SHORT).show();} else {Toast.makeText(AddInaccount.this, "请输入收入金额!",Toast.LENGTH_SHORT).show();}}});// 初始化Calendar日历对象final Calendar c = Calendar.getInstance();mYear = c.get(Calendar.YEAR);// 获取年份mMonth = c.get(Calendar.MONTH);// 获取月份mDay = c.get(Calendar.DAY_OF_MONTH);// 获取天数// 显示当前系统时间updateDisplay();}@Overrideprotected Dialog onCreateDialog(int id) {switch (id) {case DATE_DIALOG_ID:// 弹出日期选择对话框return new DatePickerDialog(this, mDateSetListener, mYear, mMonth,mDay);}return null;}// 使用OnDateSetListener监听器设置系统时间对话框private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth) {mYear = year;// 为年份赋值mMonth = monthOfYear;// 为月份赋值mDay = dayOfMonth;// 为天赋值updateDisplay();// 显示设置的日期}};/** 自定义方法显示系统时间 */private void updateDisplay() {// 显示设置的时间txtInTime.setText(new StringBuilder().append(mYear).append("-").append(mMonth + 1).append("-").append(mDay));}}
View Code

 

        另外,自己在addinaccount.xml文件中部署控件。我这个activity对应的xml文件中,(对应建立的数据表),有四个TextView控件,一个ListView控件等等。

        这个不是主程序activity,所以在自己的AndroidManifest.xml也需要配置activity。当然最开始学的时候,可以直接在MainActivity中实例操作数据库。

安卓开发中SQLite的使用(附实例)