您的位置:首页 > 数据库 > SQL

数据存储-SQLiteOpenHelper(SQLite数据库增删改查)

2014-03-04 16:40 531 查看
一、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,sage,'女' 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, name varchar(10), company varchar(20), salary integer)");
}

//数据库版本号变更时会调用onUpgrade方法,适合软件更新
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("alter table salaryInfo add phone varchar(12) null");
}
}


Student.java文件

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, String company, int salary) {
SQLiteDatabase db = helper.getWritableDatabase();
//execSQL方法可以执行sql的语句,但不可以执行查询语句;第二个参数bindArgs是对应语句中占位符的值,数值采用占位符?,避免参数有li'ming的情况出现
db.execSQL(
"insert into salaryInfo (name,company,salary) values (?,?,?)",
new Object[] { name, company, 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, company, 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, name, company, 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.getId());
values.put("name", student.getName());
values.put("company", student.getCompany());
values.put("salary", 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"}, "_id=?", new String[]{String.valueOf(sid)}, null,null,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,name,company,salary from salaryInfo limit ?,?";
String[] selectionArgs = new String[]{start+"", count+""};
Cursor cursor = db.query("salaryInfo", new String[]{"_id","name","company","salary"}, null, null, null, null, "_id desc", start+","+count);
while(cursor.moveToNext()){
students.add(new Student(cursor.getInt(cursor.getColumnIndex("_id")),
cursor.getString(cursor.getColumnIndex("name")),
cursor.getString(cursor.getColumnIndex("company")),
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,null,null,null,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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: