数据持久化之sqlite基本用法
一、ACID
即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。
一致性:事务在完成时,必须使所有的数据都保持一致状态。
隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。有时也称串行化。
持久性:在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
二、SQLiteOpenHelper
SQLiteOpenHelper 是一个抽象类,SQLiteOpenHelper 中有两个抽象方法,分别是onCreate()和 onUpgrade(),我们必须在自己的帮助类里面重写这两个方法;SQLiteOpenHelper 中还有两个非常重要的实例方法,getReadableDatabase() 和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。
1、创建数据库
首先,新建自己的帮助类,执行建表语句
public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = "create table book (" + "id integer primary key autoincrement, " + "author text, " + "price real, " + "pages integer, " + "name text)"; private Context mContext; public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); mContext = context; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK); Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show(); }
在activity中,新建MyDatabaseHelper对象,调用getWritableDatabase()方法
public class MainActivity extends Activity { private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1); Button createDatabase = (Button) findViewById(R.id.create_database); createDatabase.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { dbHelper.getWritableDatabase(); } }); } }
想查看表结构可以用sqlite explore查看。
2.基本操作
新建一个SQLiteDatabase对象获取dbhelper新建或找到的实例,sqlite提供了很多用于增删改查的方法,但是我觉得还是直接用execSQL方法和rawQuery方法直接用sql语句进行操作比较好。
增
String nameString=text1.getText().toString(); String priceString=text2.getText().toString(); String numberString=text3.getText().toString(); SQLiteDatabase db=dbhelper.getWritableDatabase(); String insertSql="insert into good(name,price,number)values(?,?,?)"; db.execSQL(insertSql,new String[]{nameString,priceString,numberString});//这里最好用占位符,因为是从edittext中获取的信息,在一条查询语句中无法识别这些变量
删
db.execSQL("delete from Book where pages > ?", new String[] { "500" });
改
db.execSQL("update Book set price = ? where name = ?", new String[] { "10.99", "The Da Vinci Code" });
查
dbhelper=new MyDatabaseHelper(this,"Store.db", null, 1); SQLiteDatabase db=dbhelper.getWritableDatabase(); // Cursor cursor=db.query("good",new String[]{"_id","name","price","number"}, null, null,null, null, "name");//两种方式 Cursor cursor=db.rawQuery("select * from good where number>3",null);
三、使用事务
SQLiteDatabase db = dbHelper.getWritableDatabase(); db.beginTransaction(); // 开启事务 try { db.delete("Book", null, null); if (true) { // 在这里手动抛出一个异常,让事务失败 throw new NullPointerException(); } ContentValues values = new ContentValues(); values.put("name", "Game of Thrones"); values.put("author", "George Martin"); values.put("pages", 720); values.put("price", 20.85); db.insert("Book", null, values); db.setTransactionSuccessful(); // 事务已经执行成功 } catch (Exception e) { e.printStackTrace(); } finally { db.endTransaction(); // 结束事务 }
beginTransaction是开启事务,setTransactionSuccessful是让事务成功,endbeginTransaction结束事务,因为事务中间出现异常,所以添加操作不会执行,而且删除操作也不会执行。