sqlite作为轻量型数据库,也就是一个.db文件,使用起来非常方便。下面简单介绍下数据库常用的增删改查操作。
首先布局文件:
效果:
借助SQLiteOpenHelper创建数据库,创建了一张表worker(id,name,adress),可以指定id为主键:id integer primary key,还可以指定自动增长,再加上autoincrement就行了。简单的说明下sqlite中常用数据类型,integer表示整型,text表示文本类型,real表示浮点型,blob表示二进制类型。
public class myDatabaseAdapter extends SQLiteOpenHelper{
private final String CREATE_TABLE_A = "create table worker(" + "id integer," + "name text," + "adress text)";
public myDatabaseAdapter(Context context, String name,CursorFactory factory, int version) {
super(context, name,factory, version);
// TODO 自动生成的构造函数存根
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO 自动生成的方法存根
db.execSQL(CREATE_TABLE_A);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO 自动生成的方法存根
}
}
MainActivity.java:
public class MainActivity extends Activity implements OnClickListener{
private String DB_NAME = "lios";
private Button buttoncreate;
private Button insert;
private Button query;
private Button update;
private Button delete;
private TextView text;
private SQLiteDatabase db;
private myDatabaseAdapter dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttoncreate = (Button)findViewById(R.id.createdatabase);
insert = (Button)findViewById(R.id.insert);
query = (Button)findViewById(R.id.query);
update = (Button)findViewById(R.id.update);
delete = (Button)findViewById(R.id.delete);
text = (TextView)findViewById(R.id.text);
dbHelper= new myDatabaseAdapter(this,DB_NAME,null,1);
buttoncreate.setOnClickListener(this);
insert.setOnClickListener(this);
query.setOnClickListener(this);
update.setOnClickListener(this);
delete.setOnClickListener(this);
}
public void onClick(View v) {
// TODO 自动生成的方法存根
switch (v.getId()) {
case R.id.createdatabase:
db = dbHelper.getWritableDatabase();
break;
case R.id.insert:
SQLiteDatabase db1 = dbHelper.getWritableDatabase();
db1.execSQL("insert into worker (id,name,adress) values (?,?,?)",new String[]{"1","w","shanghai"});
/* ContentValues values = new ContentValues();
values.put("id",1);
values.put("name","w");
values.put("adress", "shanghai");
db1.insert("worker",null, values);
values.clear();
values.put("id",3);
values.put("name","d");
values.put("adress", "shanghai");
db1.insert("worker",null, values);*/
break;
case R.id.query:
SQLiteDatabase db2 = dbHelper.getWritableDatabase();
Cursor cursor = db2.rawQuery("select * from worker",null);
if(cursor.moveToFirst()){
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
Log.d("name",name);
String adress = cursor.getString(cursor.getColumnIndex("adress"));
text.setText(id+name+adress);
}
cursor.close(); //关闭游标
break;
case R.id.update:
SQLiteDatabase db3 = dbHelper.getWritableDatabase();
db3.execSQL("update worker set id =? where name =?",new String[]{"5","w"});
Toast.makeText(this,"数据已更改",Toast.LENGTH_SHORT).show();;
break;
case R.id.delete:
SQLiteDatabase db4 = dbHelper.getWritableDatabase();
db4.execSQL("delete from worker where adress = ?",new String[]{"beijing"});
break;
default:
break;
}
}
public void onDestory(){
db.close();
}
}
public SQLiteDatabase getWritableDatabase() {
synchronized (this) {
return getDatabaseLocked(true);
}
}
或者用
SQLiteOpenHelper抽象类中getReadableDatabase()方法来获取:
public SQLiteDatabase getReadableDatabase() {
synchronized (this) {
return getDatabaseLocked(false);
}
}
为了看的更清楚,给出getDatabaseLocked()函数部分,详细请阅读源码。
private SQLiteDatabase getDatabaseLocked(boolean writable) {
if (mDatabase != null) {
if (!mDatabase.isOpen()) {
// Darn! The user closed the database by calling mDatabase.close().
mDatabase = null;
} else if (!writable || !mDatabase.isReadOnly()) {
// The database is already open for business.
return mDatabase;
}
}
.....
.....
其中getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。
而getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。