sqlite數據庫 是一個開源項目,是一個輕量的關係型數據庫。
如何使用它呢,創建它的代碼如下。
首先創建一個DBOpenHelper的類,繼承SQLiteOpenHelper。
public class MyDBOpenHelper extends SQLiteOpenHelper {
/**
*
* @param context 應用程序上下文
* @param name 數據庫的名字
* @param factory 查詢數據庫的遊標工廠 一般情況下 用sdk默認的
* @param version 數據庫的版本 版本號必須不小1
*
*/
public DBOpenHelper(Context context) {
super(context, "test.db", null, 5);
}
// 在dbOpenHelper 在數據庫第一次被創建的時候 會執行onCreate();
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println("我被調用了 oncreate");
db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("on update ");
db.execSQL("ALTER TABLE person ADD phone VARCHAR(12) NULL ");
}
}
onCreate只會在數據庫第一次創建的時候被執行。
onUpdate方法在數據可版本Version變化是被執行,用語跟新表。
這句代碼就會在test.db中創建一張表TABLE.
db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))");
DBHelper db=new DBHelper(this);
db.getReadableDatabase();
關於數據庫的增刪該查
public class PersonDAO {
private DBHelper helper;
public PersonDAO(Context context) {
helper = new DBHelper(context);
}
/**
* 增加一條記錄
* */
public void add(String name) {
SQLiteDatabase db = helper.getWritableDatabase();
if (db.isOpen()) {
/* db.execSQL("insert into person (name) values("+name+")");//寫法一 */
db.execSQL("insert into person (name) values (?)",
new Object[] { name });// 寫法二
db.close();
}
}
/**
* 查找一條記錄
* */
public boolean find(String name) {
boolean result = false;
SQLiteDatabase db = helper.getReadableDatabase();
if (db.isOpen()) {
Cursor cursor = db.rawQuery("select * from person where name=?",
new String[] { name });
if (cursor.moveToFirst()) {// 如果遊標能夠移動到第一位
int index = cursor.getColumnIndex("personid");// 得到name在表中是第幾列
String id = cursor.getString(index);
Log.i("TAG", name + "的ID是" + id);
result = true;
// 記得關閉掉cursor
cursor.close();
}
result = false;
db.close();
}
return result;
}
/***
* 刪除一條記錄
*
* @param name
*/
public void delete(String name) {
SQLiteDatabase db = helper.getWritableDatabase();
if (db.isOpen()) {
db.execSQL("delete from person where name=?", new Object[] { name });
db.close();
}
}
/**
* 跟新一條數據
* */
public boolean update(String oldName, String newName) {
SQLiteDatabase db = helper.getWritableDatabase();
if (db.isOpen()) {
db.execSQL("update person set name=? where name=?", new Object[] {
newName, oldName });
db.close();
return true;
}
return false;
}
}
在Activity中,只要
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PersonDAO personDAO=new PersonDAO(this);
personDAO.add("張三");
}
}
也可以使用自帶的API來操作數據庫,這樣不用自己寫sql語句。
public class PersonDBDao {
private Context context;
MyDBOpenHelper dbOpenHelper;
public PersonDBDao(Context context) {
this.context = context;
dbOpenHelper = new MyDBOpenHelper(context);
}
/**
* 添加一條記錄
*/
public void add(String name, int age) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
if (db.isOpen()) {
// db.execSQL("insert into person (name,age) values (?,?)",new
// Object[]{name,age});
// db.execSQL("insert into person ",null) // 不合法的sql語句
ContentValues values = new ContentValues();
values.put("name", name);
values.put("age", age);
// 如果 contentvalues爲空
db.insert("person", null, values); // 組拼sql語句完成的添加的操作
//第二個參數null的意義:如果values爲空則執行 insert into person name values (NULL) ;
db.close();
}
}
/**
* 刪除一條記錄
*/
public void delete(String name) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
if (db.isOpen()) {
db.delete("person", "name=?", new String[] { name });
db.close();
}
}
/**
* 數據庫的更改操作
*/
public void update(String name, String newname, int newage) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
if (db.isOpen()) {
ContentValues values = new ContentValues();
values.put("name", newname);
values.put("age", newage);
db.update("person", values, "name=?", new String[] { name });
db.close();
}
}
/**
* 數據庫的查詢操作
*/
public boolean find(String name) {
boolean result = false;
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
if (db.isOpen()) {
// select * from person
Cursor cursor = db.query("person", null, "name=?",
new String[] { name }, null, null, null);
if (cursor.moveToFirst()) {
result = true;
}
cursor.close();
db.close();
}
return result;
}
/**
* 查詢所有信息
*/
public List<Person> findAll() {
List<Person> persons = null;
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
if (db.isOpen()) {
Cursor cursor = db.query("person", null, null, null, null, null,
null);
persons = new ArrayList<Person>();
while (cursor.moveToNext()) {
Person person = new Person();
String name = cursor.getString(cursor.getColumnIndex("name"));
person.setName(name);
int age = cursor.getInt(cursor.getColumnIndex("age"));
person.setAge(age);
persons.add(person);
}
cursor.close();
db.close();
}
return persons;
}
/**
* 查詢所有信息
*/
public Cursor findAllbyCursor() {
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
if (db.isOpen()) {
/*Cursor cursor = db.query("person", null, null, null, null, null,
null);*/
Cursor cursor = db.rawQuery("select personid as _id,age,name from person", null);
return cursor;
// 注意了 一定不要把數據庫 關閉了
}
return null;
}}
涉及到事務的操作,用一下例子來說明:
/**
* 銀行轉賬的方法
*/
public void transaction() {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
if (db.isOpen()) {
try {
// 開啓數據庫的事務
db.beginTransaction();
// 給張三設置1000塊錢的賬戶
db.execSQL("update person set account=? where name=?",
new Object[] { 1000, "zhangsan98" });
// 把張三的賬戶扣除200塊錢
db.execSQL("update person set account=account-? where name=?",
new Object[] { 200, "zhangsan98" });
// 出現了異常
// 把張三的錢給李四
//初始化李四賬戶 爲 0
db.execSQL("update person set account=? where name=?",
new Object[] { 0, "lisi" });
db.execSQL("update person set account=account+? where name=?",
new Object[] { 200, "lisi" });
db.setTransactionSuccessful();
}
// 顯示的設置事務是否成功
catch (Exception e) {
// TODO: handle exception
} finally {
db.endTransaction();
db.close();
}
}
}