数据持久化之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结束事务,因为事务中间出现异常,所以添加操作不会执行,而且删除操作也不会执行。



posted @ 2016-06-16 14:26  LibraSun  阅读(1209)  评论(0编辑  收藏  举报