加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

数据存储-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、调用SQLiteOpenHelpergetReadableDatabasegetWriteableDatabase两个方法获得可读、可写的SQLiteOpenHelper对象。New一个对象时不会创建数据库对象,只有调用这两个方法中的任意一个后,才会创建数据库对象。

2、回调函数

onCreate:该函数会在第一次创建数据库的时候执行,一般可用于创建表。

onUpgrade:该函数在数据库版本发生改变时被调用,一般可用于修改表结构。


三、SQLiteOpenHelperonUpgrade方法

	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");
	}
}



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,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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读