操作数据库需要通过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