SQLite操作

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



 

posted @ 2013-04-08 14:47  坚固66  阅读(196)  评论(0编辑  收藏  举报