zoukankan      html  css  js  c++  java
  • 安卓开发中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
    
    }
    
    }
    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 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;
    }
    
    }
    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);
    }
    // 如果没有数据,则返回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;
    }
    }
    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;
    
    @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));
    }
    
    }
    View Code

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

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

  • 相关阅读:
    孙权用人之道:“六力”兼备
    JDK 自带工具试用(一)
    Apache ab 测试工具使用(一)
    Amoeba详细介绍
    TCP/IP 标志位 SYN ACK RST UTG PSH FIN
    ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'
    jsp 中声明方法的使用
    Java遍历一个文件夹下的全部文件
    WAMP 2.5 &quot;FORBIDDEN&quot; error
    LeetCode总结--二分查找篇
  • 原文地址:https://www.cnblogs.com/xuanwei-qingfeng/p/4119588.html
Copyright © 2011-2022 走看看