数据存储之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, name, 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", null, values);
			db.close();
		}
	}

	//删除操作
	public void delete(String name) {
		SQLiteDatabase db = mySQLiteHelper.getWritableDatabase();
		if (db.isOpen()) {
			//删除名字=name的行。
			db.delete("person", "name = ?", new String[] { name });
			db.close();
		}
	}
	
	//更新数据操作
	public void update(int id, 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, null, null, null, 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, name, 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", "age" },
					"name = ?", new String[] { name }, null, null, 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; 查看数据库全部数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值