数据存储-SQLiteOpenHelper(SQLite数据库增删改查)
发布时间:2020-12-12 20:05:59 所属栏目:百科 来源:网络整理
导读:一、Android 数据存储方式 ?1. 文件 ?2. SQLite数据库 ?3.SharedPreferences(参数) ?4.内容提供者(Content Providers) ?5.网络 二 、 SQLiteOpenHelper 的使用方法 —SQLiteOpenHelper是一个访问SQLite的助手类。 —编写继承SQLiteOpenHelper的类, 此类提供
一、Android数据存储方式 ?1.文件 ?2.SQLite数据库 ?3.SharedPreferences(参数) ?4.内容提供者(Content Providers) ?5.网络 二、SQLiteOpenHelper的使用方法 —SQLiteOpenHelper是一个访问SQLite的助手类。 —编写继承SQLiteOpenHelper的类, 此类提供方法: 1、调用SQLiteOpenHelper的getReadableDatabase或getWriteableDatabase两个方法获得可读、可写的SQLiteOpenHelper对象。New一个对象时不会创建数据库对象,只有调用这两个方法中的任意一个后,才会创建数据库对象。 2、回调函数 onCreate:该函数会在第一次创建数据库的时候执行,一般可用于创建表。 onUpgrade:该函数在数据库版本发生改变时被调用,一般可用于修改表结构。
三、SQLiteOpenHelper的onUpgrade方法
public void onUpgrade(SQLiteDatabase arg0,int arg1,int arg2) { // 把原有表格备份 arg0.execSQL("alter table salaryInfo rename to temp_salaryInfo"); // 创建新的表格 arg0.execSQL("create table salaryInfo (_id integer primary key autoincrement,name varchar(10),company varchar(20),salary integer)"); // 把原表格数据插入到新表格中 arg0.execSQL("insert into salaryInfo (sname,sage,sex) select sname,'女' from temp_salaryInfo"); } 或者直接修改表结构
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) { db.execSQL("alter table salaryInfo add phone varchar(12) null"); } 四、使用事务
//------------------------------------------------------------------- //使用事务-模拟银行转账 public void payment(){ SQLiteDatabase db = helper.getWritableDatabase(); db.beginTransaction();//开启事务 try{ db.execSQL("update salaryInfo set salary=salary-10 where _id=1"); db.execSQL("update salaryInfo set salary=salary+10 where _id=2"); //事务的标志决定事务结束时的状态,若标志为true事务就会commit,反之则rollback,默认情况下标志为false db.setTransactionSuccessful();//设置事务的标志为true }finally{ db.endTransaction();//结束事务,有两种情况:commit、rollback } }
五、文件事例 SalaryInfoDBOpenHelper.java文件
package com.itheima.salary.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; /** * 创建一个数据库打开的帮助类 实现默认的构造方法指定数据库的名称 游标工厂 数据库的版本 * 在oncreate()方法里面初始化数据库的表结构 * @author Administrator * */ public class SalaryInfoDBOpenHelper extends SQLiteOpenHelper { //实现一个默认的构造方法 public SalaryInfoDBOpenHelper(Context context) { super(context,"student.db",null,1); } //数据库第一次被创建的时候调用的方法,适合做数据库表结构的初始化 @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table salaryInfo (_id integer primary key autoincrement,salary integer)"); } //数据库版本号变更时会调用onUpgrade方法,适合软件更新 @Override public void onUpgrade(SQLiteDatabase db,int newVersion) { db.execSQL("alter table salaryInfo add phone varchar(12) null"); } }
package com.itheima.salary.domain;
public class Student {
private int id;
private String name;
private String company;
private int salary;
public Student(){}
public Student(int id,String name,String company,int salary){
this.id = id;
this.name = name;
this.company = company;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
@Override
public String toString() {
return "StudentInfo [id=" + id + ",name=" + name + ",company="
+ company + ",salary=" + salary + "]";
}
}
StudentDao.java文件
package com.itheima.salary.db.dao; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.itheima.salary.db.SalaryInfoDBOpenHelper; import com.itheima.salary.domain.Student; /** * 学生信息 操作访问的dao 处理学生数据的增删改查 * */ public class StudentDao { private Context context; private SalaryInfoDBOpenHelper helper;//继承自SQLiteOpenHelper的类 /** * 在构造方法里面必须传递进来一个上下文对象 * @param context */ public StudentDao(Context context) { this.context = context; // 构造方法实例化数据库打开的帮助类 helper = new SalaryInfoDBOpenHelper(context); } //------------------------------------------------------------------- //使用execSQL和rawQuery对数据库进行增删改查 /** * 向学生数据库插入一条记录 * @param name 学生姓名 * @param company 公司名称 * @param salary 学生的工资 */ public void insert(String name,int salary) { SQLiteDatabase db = helper.getWritableDatabase(); //execSQL方法可以执行sql的语句,但不可以执行查询语句;第二个参数bindArgs是对应语句中占位符的值,数值采用占位符?,避免参数有li'ming的情况出现 db.execSQL( "insert into salaryInfo (name,company,salary) values (?,?,?)",new Object[] { name,salary }); // 节约资源。关闭数据库 db.close(); } /** * 根据学生的id删除数据 * @param id 学生的id号码 */ public void delete(int id) { SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("delete from salaryInfo where _id=?",new Object[] { id }); db.close(); } /** * 删除多个学生 * @param sids */ public void del(Integer... sids){ SQLiteDatabase db = helper.getWritableDatabase(); if(sids.length > 0){ StringBuffer sb = new StringBuffer(); for(int i = 0; i < sids.length; i++){ sb.append('?').append(',');//添加多个占位符 } sb.deleteCharAt(sb.length() - 1);//删除最后多余的一个” ,” db = helper.getWritableDatabase(); String sql = "delete from salaryInfo where sid in ("+sb+")"; db.execSQL(sql,(Object[])sids);//删除多个sid } db.close(); } /** * 更新学员的薪水信息 * @param id 学生的id * @param newsalary 新的工资信息 */ public void updateSalary(int id,int newsalary) { SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("update salaryInfo set salary=? where _id=?",new Object[] { newsalary,id }); db.close(); } /** * 根据学生是的id查询学生的信息。 * @param id * @return 学生信息的对象。 如果返回null代表是没有查询到当前学生 */ public Student find(int id){ //获取到一个可读的数据库 SQLiteDatabase db = helper.getReadableDatabase(); //执行查询语句,查询结果放入结果集的游标cursor中 Cursor cursor = db.rawQuery("select * from salaryInfo where _id=?",new String[]{String.valueOf(id)}); Student student = null; //第一次使用moveToNext方法,使cursor指向查询结果中的第一条记录 if(cursor.moveToNext()){ String name = cursor.getString(cursor.getColumnIndex("name")); String company = cursor.getString(cursor.getColumnIndex("company")); int salary = cursor.getInt(cursor.getColumnIndex("salary")); student = new Student(id,name,salary); } cursor.close(); db.close(); return student; } /** * 分页获取记录 * @param offset 跳过多少条记录 * @param maxresult 获取多少条记录 * @return */ public List<Student> getScrollData(int offset,int maxresult){ List<Student> students = new ArrayList<Student>(); SQLiteDatabase db = helper.getReadableDatabase(); Cursor cursor = db.rawQuery("select * from salaryInfo group by_id asc limit ?,?",new String[]{String.valueOf(offset),String.valueOf(maxresult)}); while(cursor.moveToNext()){ int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); String company = cursor.getString(cursor.getColumnIndex("company")); int salary = cursor.getInt(cursor.getColumnIndex("salary")); Student student = new Student(id,salary); students.add(student); } db.close(); return students; } public long getCount(){ SQLiteDatabase db = helper.getReadableDatabase(); Cursor cursor = db.rawQuery("select count(*) from salaryInfo",null); cursor.moveToFirst(); long count = cursor.getLong(0); return count; } //------------------------------------------------------------------- //使用insert、update、query、delete对数据库进行增删改查 public void add1(Student student){ SQLiteDatabase db = helper.getWritableDatabase(); db = helper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("_id",student.getId()); values.put("name",student.getName()); values.put("company",student.getCompany()); values.put("salary",student.getSalary()); db.insert("salaryInfo","_id",values); } public void update1(Student student){ SQLiteDatabase db = helper.getWritableDatabase(); db = helper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("_id",student.getSalary()); db.update("salaryInfo",values,"_id=?",new String[]{String.valueOf(student.getId())}); } public Student find1(int sid){ SQLiteDatabase db = helper.getReadableDatabase(); Student student = null; db = helper.getWritableDatabase(); Cursor cursor = db.query("salaryInfo",new String[]{"_id","name","company","salary"},new String[]{String.valueOf(sid)},null); if(cursor.moveToNext()){ student = new Student(cursor.getInt(cursor.getColumnIndex("_id")),cursor.getString(cursor.getColumnIndex("name")),cursor.getString(cursor.getColumnIndex("company")),cursor.getInt(cursor.getColumnIndex("salary"))); } return student; } public void del1(Integer... sids){ SQLiteDatabase db = helper.getWritableDatabase(); if(sids.length > 0){ StringBuffer sb = new StringBuffer(); String[] strSb = new String[sids.length]; for(int i=0; i<sids.length; i++){ sb.append('?').append(','); strSb[i] = String.valueOf(sids[i]); } sb.deleteCharAt(sb.length()-1); db.delete("salaryInfo","_id in ("+sb+")",strSb); } } public List<Student> getScrollData1(int start,int count){ SQLiteDatabase db = helper.getReadableDatabase(); List<Student> students = new ArrayList<Student>(); db = helper.getWritableDatabase(); String sql = "select _id,salary from salaryInfo limit ?,?"; String[] selectionArgs = new String[]{start+"",count+""}; Cursor cursor = db.query("salaryInfo","_id desc",start+","+count); while(cursor.moveToNext()){ students.add(new Student(cursor.getInt(cursor.getColumnIndex("_id")),cursor.getInt(cursor.getColumnIndex("salary")))); } return students; } public long getCount1(){ SQLiteDatabase db = helper.getWritableDatabase(); String sql = "select count(sid) from salaryInfo"; Cursor cursor = db.query("salaryInfo",new String[]{"count(*)"},null); if(cursor.moveToNext()){ return cursor.getLong(0); } return 0; } } MainActivity.java文件
package com.itheima.salary; import android.app.Activity; import android.os.Bundle; import android.view.View; import com.itheima.salary.db.dao.StudentDao; import com.itheima.salary.domain.Student; public class MainActivity extends Activity { private StudentDao dao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dao = new StudentDao(this); } /** * 添加一条记录的按钮 * @param view */ public void add(View view){ dao.insert("张三","xx科技公司",1000); } /** * 删除一条记录 * @param view */ public void delete(View view){ dao.delete(1); } /** * 更新学生工资信息 * @param view */ public void update(View view){ dao.updateSalary(1,9999); } /** * 查询某个学生的信息 */ public void query(View view){ Student info = dao.find(1); System.out.println("学生的信息:"+info.toString()); } } activity_main.xml文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:onClick="add" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="添加一条记录" /> <Button android:onClick="delete" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="删除一条记录" /> <Button android:onClick="update" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="修改一条记录" /> <Button android:onClick="query" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查询一条记录" /> </LinearLayout> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |