操作数据库需要通过SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()来获得可读和可读写的SQLiteDatabase。
然后通过SQLiteDatabase的一系列方法来操作数据库。
因为SQLiteOpenHelper是抽象类,需要自己写一个类来继承它。
下面通过一个例子来说明如何操作数据库。
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* SQLiteOpenHelper是一个抽象类,不能直接使用,需要自己写一个类继承它。
* 然后可以通过getReadableDatabase()获取一个可读的database;<br>
* 通过getWritableDatabase()方法获取一个可读写的Database。<br>
* 如果只有查询操作,就用getReadableDatabase()就可以了。
* @author lucky star
*
*/
public class DatabaseHelper extends SQLiteOpenHelper {
// 数据库版本号,从1开始,必须是大于0的整数。
public final static int VERSION = 1;
// 需要复写SQLiteOpenHelper的这个构造方法。
public DatabaseHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
public DatabaseHelper(Context context,String name,int version) {
this(context,name,null,version);
}
public DatabaseHelper(Context context,String name) {
this(context,name,null,VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.d("DatabaseHelper", "onCreate()");
// 创建数据时就创建好表结构。
db.execSQL("create table user(id int primary key,name varchar(32),age int)");
Log.d("DatabaseHelper","create table user.");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d("DatabaseHelper","onUpgrade()");
}
}
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class DatabaseOperationActivity extends Activity {
// 创建数据库
private Button createDatabaseBtn = null;
// 升级数据库
private Button upgradeDatabaseBtn = null;
private Button insertBtn = null;
private Button updateBtn = null;
private Button queryBtn = null;
private Button deleteBtn = null;
private DatabaseHelper dh = null;
private SQLiteDatabase sdb = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.database);
createDatabaseBtn = (Button) findViewById(R.id.database_creaet_btn);
insertBtn = (Button) findViewById(R.id.database_add_btn);
updateBtn = (Button) findViewById(R.id.database_update_btn);
queryBtn = (Button) findViewById(R.id.database_query_btn);
deleteBtn = (Button) findViewById(R.id.database_delete_btn);
upgradeDatabaseBtn = (Button) findViewById(R.id.database_upgrade_btn);
createDatabaseBtn.setOnClickListener(new CreateDatabaseListener());
upgradeDatabaseBtn.setOnClickListener(new UpgradeDatabaseListener());
insertBtn.setOnClickListener(new InsertDataListener());
updateBtn.setOnClickListener(new UpdateDataListener());
queryBtn.setOnClickListener(new QueryDataListener());
deleteBtn.setOnClickListener(new DeleteDataListener());
}
class CreateDatabaseListener implements OnClickListener {
@Override
public void onClick(View v) {
// 创建的数据库名是:lucky_star_db
dh = new DatabaseHelper(DatabaseOperationActivity.this, "lucky_star_db");
// 只执行上面一行代码是不会创建数据库的,需要调用它的getReadableDatabase()或getWritableDatabase()方法。
//dh.getReadableDatabase();
// 因为后面会用到增,删,改,查,必须调用getWritable()方法来得到SQLiteDatabase对象,因此声明一个成员变量
// 这里用dh.getWritableDatabase()初始化。
sdb = dh.getWritableDatabase();
}
}
class UpgradeDatabaseListener implements OnClickListener {
@Override
public void onClick(View v) {
// 创建的数据库名是:lucky_star_db,创建的数据库版本号是1,这里升级数据库,版本号为2
dh = new DatabaseHelper(DatabaseOperationActivity.this, "lucky_star_db",2);
// 只执行上面一行代码是不会创建数据库的,需要调用它的getReadableDatabase()或getWritableDatabase()方法。
//dh.getReadableDatabase();
// 因为后面会用到增,删,改,查,必须调用getWritable()方法来得到SQLiteDatabase对象,因此声明一个成员变量
// 这里用dh.getWritableDatabase()初始化。
sdb = dh.getWritableDatabase();
}
}
class InsertDataListener implements OnClickListener {
@Override
public void onClick(View v) {
ContentValues values = new ContentValues();
values.put("id", 1);
values.put("name", "诸葛亮");
values.put("age", 29);
sdb.insert("user", null, values);
Log.d(DatabaseOperationActivity.this.getClass().getName(), "insert data into db.");
}
}
class UpdateDataListener implements OnClickListener {
@Override
public void onClick(View v) {
ContentValues values = new ContentValues();
values.put("id", 1);
values.put("name", "貂蝉");
values.put("age", 21);
sdb.update("user", values, "id=? and age=?", new String[]{"1","29"});
Log.d(DatabaseOperationActivity.this.getClass().getName(), "update data.");
}
}
class QueryDataListener implements OnClickListener {
@Override
public void onClick(View v) {
ContentValues values = new ContentValues();
values.put("id", 1);
values.put("name", "貂蝉");
values.put("age", 21);
Cursor cursor = sdb.query("user", new String[]{"id","name","age"}, "id=?", new String[] {"1"}, null, null, null);
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("id"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String msg = "查询到数据:[id:" + id + ",name:" + name + ",age:" + age;
Log.d(DatabaseOperationActivity.this.getClass().getName(), msg);
Toast.makeText(DatabaseOperationActivity.this, msg, Toast.LENGTH_LONG).show();
}
Log.d(DatabaseOperationActivity.this.getClass().getName(), "query data.");
}
}
class DeleteDataListener implements OnClickListener {
@Override
public void onClick(View v) {
sdb.delete("user", "id=?", new String[] {"1"});
Log.d(DatabaseOperationActivity.this.getClass().getName(), "delete data.");
}
}
}
布局文件database.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/database_creaet_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/createDatabase"
/>
<Button
android:id="@+id/database_upgrade_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/upgradeDatabase"
/>
<Button
android:id="@+id/database_add_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/addData"
/>
<Button
android:id="@+id/database_update_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/updateData"
/>
<Button
android:id="@+id/database_query_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/queryData"
/>
<Button
android:id="@+id/database_delete_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/deleteData"
/>
</LinearLayout>
效果图:
非常简单,6个按钮,一个按钮对应一种数据库操作。
先看看创建数据库:
单击“创建数据库”按钮,屏幕上没有任何提示,那我们怎么查看是否创建成功了呢?
ps:因为我的环境变量没有配置,因此是直接进入adb所在目录执行的命令。
可以看到,有一个data目录,进入里面。
下面还有一个data目录,进入其中。
标红的部分是我的应用程序的包名,进入其中
进入databases
OK,这个就是我们的数据库名了。上面的activity中,创建数据库时指定的名字就是这个。
在终端中进入数据库,查看创建的数据库和表。
下面看插入数据到数据库。
单击“添加数据”按钮,
然后查看是否增加成功。
OK,增加数据成功,只不过是乱码。
OK,再看查看数据,单击查看数据。
可以看到查询数据OK了,保存的时候在数据库中保存的是乱码,查询出来时OK的。
OK,修改数据,单击修改按钮。
OK,修改数据成功。
看看删除数据是否OK,单击“删除”按钮,
OK,删除数据也是OK的。
最后,看看升级数据库。
单击“升级数据库”按钮。
数据库版本发生变化时会调用SQLiteOpenHelper的onUpgrade()方法,在代码中我们输出一句话。
单击“升级数据库”按钮后,控制台输出:
04-07 13:52:28.538: DEBUG/DatabaseHelper(520): onUpgrade()
在创建数据库时会调用onCreate()方法,控制台输出:
04-07 13:44:09.292: DEBUG/DatabaseHelper(520): onCreate()
其实,在上面的每一个操作都输出有日志,下面看看输出:
04-07 13:44:09.292: DEBUG/DatabaseHelper(520): onCreate()--》创建数据库时调用
04-07 13:44:09.302: DEBUG/DatabaseHelper(520): create table user.--》创建数据库时调用
04-07 13:45:33.445: DEBUG/com.and.test.DatabaseOperationActivity(520): insert data into db.-->插入数据时
04-07 13:47:55.182: DEBUG/com.and.test.DatabaseOperationActivity(520): 查询到数据:[id:1,name:诸葛亮,age:29-->查询数据时
04-07 13:47:55.412: DEBUG/com.and.test.DatabaseOperationActivity(520): query data.
04-07 13:49:19.495: DEBUG/com.and.test.DatabaseOperationActivity(520): update data.-->更新数据时
04-07 13:50:30.862: DEBUG/com.and.test.DatabaseOperationActivity(520): delete data.
04-07 13:52:28.538: DEBUG/DatabaseHelper(520): onUpgrade()-->数据库升级时。
在终端中删除数据库可以用rm 数据库文件名。如本例中rm lucky_star_db