数据存储之SQLite使用

前端之家收集整理的这篇文章主要介绍了数据存储之SQLite使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、使用sql语句进行增删改查等操作

1、自定义一个类,继承sqliteOpenHelper类,用来创建和更新数据库

<span style="font-size:18px;">public class MysqLiteHelper extends sqliteOpenHelper {
	/**
	 * 
	 * @param context
	 * @param name      数据库名字
	 * @param factory   游标工厂
	 * @param version   数据库版本
	 */
	public MysqLiteHelper(Context context,String name,CursorFactory factory,int version) {
		super(context,name,factory,version);
	}

	//第一次连接数据库时,如果数据库不存在,则调用方法。如果已存在,则不调用。
	@Override
	public void onCreate(sqliteDatabase db) {
		//通过sql语句建表,表名是person,该表中有三个字段。_id是自增加的ID,name是varchar类型,
		//age是integer类型
		String sql = "Create table person(_id integer primary key autoincrement,"
				+ "name varchar(20),age integer);";
		db.execsql(sql);
	}

	//当数据库的版本发生变化时,回调该方法。因此该方法一般用来处理数据库升级包括建表 删表 增加字段等
	@Override
	public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {
		if(oldVersion == 1 && newVersion == 2){
			//建新的表
			String sql = "Create table if not exists hello(_id integer primary key autoincrement,"
					+ "name varchar(20),age integer);";
			db.execsql(sql);
		} else if(oldVersion == 2 && newVersion == 3){
			//增加字段
			String sql = "Alter table person add balance integer;";
			db.execsql(sql);
		}else if(oldVersion == 3 && newVersion == 4){
			//删除表
			String sql = "Drop table hello;";
			db.execsql(sql);
		}
	}

}</span>

2、增删改查操作。
<span style="font-size:18px;">public class sqliteOperator {
	private MysqLiteHelper MysqLiteHelper;

	public sqliteOperator(Context context) {
		MysqLiteHelper = new MysqLiteHelper(context,"test.db",null,1);
		// 调用方法后,会连接数据库,如果数据库不存在就会调用onCreate方法
		MysqLiteHelper.getReadableDatabase();
	}
	
	//增加数据操作
	public void insert(Person p) {
		sqliteDatabase db = MysqLiteHelper.getWritableDatabase();
		if (db.isOpen()) {
			//值是通过占位符?来处理
			String sql = "insert into person(name,age) values(?,?);";
			db.execsql(sql,new Object[] { p.getName(),p.getAge() });
			db.close();
		}
	}
	
	//删除操作
	public void delete(String name) {
		sqliteDatabase db = MysqLiteHelper.getWritableDatabase();
		if (db.isOpen()) {
			String sql = "delete from person where name = ?;";
			db.execsql(sql,new String[] { name });
			db.close();
		}
	}
	
	//更新数据操作
	public void update(int id,String name) {
		sqliteDatabase db = MysqLiteHelper.getWritableDatabase();
		if (db.isOpen()) {
			String sql = "update person set name = ? where _id = ?;";
			db.execsql(sql,new Object[] { name,id });
			db.close();
		}
	}
	
	//查询全部数据
	public List<Person> queryAll() {
		sqliteDatabase db = MysqLiteHelper.getReadableDatabase();
		if (db.isOpen()) {
			String sql = "select * from person;";
			Cursor rawQuery = db.rawQuery(sql,null);
			List<Person> personList = new ArrayList<Person>();
			if (rawQuery != null && rawQuery.getCount() > 0) {
				int id = 0;
				String name = null;
				int age = 0;
				while (rawQuery.moveToNext()) {
					id = rawQuery.getInt(0);
					name = rawQuery.getString(1);
					age = rawQuery.getInt(2);
					personList.add(new Person(id,age));
				}
				db.close();
				return personList;
			}
			db.close();
		}
		return null;
	}
	
	//查询一条数据
	public Person queryItem(String name){
		sqliteDatabase db = MysqLiteHelper.getReadableDatabase();
		if (db.isOpen()) {
			//查询名字是xxx的数据,得到其中的name和age字段。
			String sql = "select name,age from person where name = ?;";
			Cursor rawQuery = db.rawQuery(sql,new String[]{name});
			int id = 0;
			String _name = null;
			int age = 0;
			if(rawQuery != null && rawQuery.moveToFirst()){
				//由于得到的是name和age字段,所以下标0是表示name的值,下标1是age的值。
				_name = rawQuery.getString(0);
				age = rawQuery.getInt(1);
				db.close();
				return new Person(id,_name,age);
			}
			db.close();
		}
		return null;
	}

}</span>

二、通过Android的API方式进行增删改查操作。

1、自定义一个类,继承sqliteOpenHelper类,用来创建和更新数据库。和上面的第一点是一样的。

2、增删改查操作。

<span style="font-size:18px;">// 增加数据操作
	public void insert(Person p) {
		sqliteDatabase db = MysqLiteHelper.getWritableDatabase();
		if (db.isOpen()) {
			ContentValues values = new ContentValues();
			//插入一条新数据,根据键和值
			values.put("name",p.getName());
			values.put("age",p.getAge());
			db.insert("person",values);
			db.close();
		}
	}

	//删除操作
	public void delete(String name) {
		sqliteDatabase db = MysqLiteHelper.getWritableDatabase();
		if (db.isOpen()) {
			//删除名字=name的行。
			db.delete("person","name = ?",String name) {
		sqliteDatabase db = MysqLiteHelper.getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put("name",name);
		if (db.isOpen()) {
			//values是要修改的值。_id是条件
			db.update("person",values,"_id = ?",new String[] { id + "" });
			db.close();
		}
	}

	//查询全部
	public List<Person> queryAll() {
		sqliteDatabase db = MysqLiteHelper.getReadableDatabase();
		if (db.isOpen()) {
			//查询全部,得到字段是name和age的全部列
			Cursor cursor = db.query("person",new String[] { "name","age" },null);
			if (cursor != null && cursor.getCount() > 0) {
				List<Person> personList = new ArrayList<Person>();
				while (cursor.moveToNext()) {
					String name = cursor.getString(0);
					int age = cursor.getInt(1);
					personList.add(new Person(1,age));
				}
				db.close();
				return personList;
			}
			db.close();
		}
		return null;
	}
	
	//查询一条数据
	public Person queryItem(String name) {
		sqliteDatabase db = MysqLiteHelper.getReadableDatabase();
		if (db.isOpen()) {
			Cursor cursor = db.query("person",new String[] { name },null);
			if (cursor != null && cursor.moveToFirst()) {
				String mName = cursor.getString(0);
				int age = cursor.getInt(1);
				db.close();
				return new Person(2,mName,age);
			}
			db.close();
		}
		return null;
	}</span>

三、事务操作API。

情景一:A向B汇钱,A的账户钱扣掉后,ATM死机了,这时B的账号也没有执行余额增加,就会出现问题。事务操作可以避免这种情况的发生。

<span style="font-size:18px;">private void testTransaction() {
		sqliteDatabase db = MysqLiteHelper.getWritableDatabase();
		//开始事务操作
		db.beginTransaction();
		try {
			db.execsql("update person set balance = balance - 100 where name = 'zhangsan'");
			
			//出异常
			
			db.execsql("update person set balance = balance + 100 where name = 'lisi'");
			//标记事务操作成功
			db.setTransactionSuccessful();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//结束事务操作
			db.endTransaction();
		}
	}</span>

开始事务操作后,此时执行第一条sql语句是预执行,然后出现异常,此时就会跳到catch里而并没有预执行第二条sql语句。然后接着执行finally里的语句,结束事务操作。当事务结束操作时发现,自己的标志位没有标记成功,那么第一条sql也不会被真正地执行。只有当结束事务操作时,发现setTransactionSuccessful()才会认为此次操作是成功的,那么就会把之前预执行的sql语句真正执行。


情景二:假如向数据库中新增加10000条数据,如果用直接使用for循环就会非常地慢,每一次都要打开数据库,插入数据。而如果使用上面的事务操作,那么效率就会大大的提高,因为for循环10000次都是预操作,等最后标记位成功了,才打开数据库,真正插入这些数据。节省下来的就是打开数据库的时间。


四、sqlite3工具使用

命令行输入adb shell

进入到应用程序数据库存放的位置 /data/data/包名/databases 目录下

输入sqlite3 test.db即可进入到该数据库

select * from person; 查看数据库全部数据

猜你在找的Sqlite相关文章