安卓开发中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 } @Override public 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))"); } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { // TODO Auto-generated method stub } }
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 stub super(); } /**自定义有参构造函数*/ 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; } }
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); } // 如果没有数据,则返回0 return 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); } // 如果没有数据,则返回0 return 0; } }
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; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.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() { @Override public void onClick(View arg0) { // 显示日期选择对话框 showDialog(DATE_DIALOG_ID); } }); // 为保存按钮添加监听事件 CancelBtn.setOnClickListener(new OnClickListener() { @Override public 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() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub String 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(); } @Override protected 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)); } }
另外,自己在addinaccount.xml文件中部署控件。我这个activity对应的xml文件中,(对应建立的数据表),有四个TextView控件,一个ListView控件等等。
这个不是主程序activity,所以在自己的AndroidManifest.xml也需要配置activity。当然最开始学的时候,可以直接在MainActivity中实例操作数据库。