《Android高手进阶教程》13.Android数据库SQLiteDatabase的使用

大家好,好久没有更新博客了,最近由于身体不适让大家久等了,好了,直接进入主题。

Android提供了三种数据存储方式:
第一种是文件存储。
第二种是SharedPreferences存储。
第三种是数据库SQLiteDatabase存储。

文件存储我就不多说了,而SharedPreferences可以存取简单的数据(int,double,float.etc),它经常用于数据缓存,因为它读取存储简单。详细可以参见本系列《Android高手进阶教程》7.Android Preferences的使用

今天我们将讲一下Android SQLiteDatabase的使用。而掌握SqliteDatabase,将会我们接下来掌握ContentProvider打下良好的基石。

为了让大家更好的掌握,我们手把手完成该节的Demo。

第一步:新建一个Android工程,命名为SQLiteDatabaseDemo

SQLiteDatabaseDemo

第二步:创建一个新的类BooksDB.java这个类要继承于android.database.sqlite.SQLiteOpenHelper抽象类,我们要实现其中两个方法:onCreate(),onUpdate。具体代码如下:

package com.android.tutor;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class BooksDB extends SQLiteOpenHelper {
	private final static String DATABASE_NAME = "BOOKS.db";
	private final static int DATABASE_VERSION = 1;
	private final static String TABLE_NAME = "books_table";
	public final static String BOOK_ID = "book_id";
	public final static String BOOK_NAME = "book_name";
	public final static String BOOK_AUTHOR = "book_author";

	public BooksDB(Context context) {
		// TODO Auto-generated constructor stub
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}

	// 创建table
	@Override
	public void onCreate(SQLiteDatabase db) {
		String sql = "CREATE TABLE " + TABLE_NAME + " (" + BOOK_ID
				+ " INTEGER primary key autoincrement, " + BOOK_NAME
				+ " text, " + BOOK_AUTHOR + " text);";
		db.execSQL(sql);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;
		db.execSQL(sql);
		onCreate(db);
	}

	public Cursor select() {
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cursor = db
				.query(TABLE_NAME, null, null, null, null, null, null);
		return cursor;
	}

	// 增加操作
	public long insert(String bookname, String author) {
		SQLiteDatabase db = this.getWritableDatabase();
		/* ContentValues */
		ContentValues cv = new ContentValues();
		cv.put(BOOK_NAME, bookname);
		cv.put(BOOK_AUTHOR, author);
		long row = db.insert(TABLE_NAME, null, cv);
		return row;
	}

	// 删除操作
	public void delete(int id) {
		SQLiteDatabase db = this.getWritableDatabase();
		String where = BOOK_ID + " = ?";
		String[] whereValue = { Integer.toString(id) };
		db.delete(TABLE_NAME, where, whereValue);
	}

	// 修改操作
	public void update(int id, String bookname, String author) {
		SQLiteDatabase db = this.getWritableDatabase();
		String where = BOOK_ID + " = ?";
		String[] whereValue = { Integer.toString(id) };

		ContentValues cv = new ContentValues();
		cv.put(BOOK_NAME, bookname);
		cv.put(BOOK_AUTHOR, author);
		db.update(TABLE_NAME, cv, where, whereValue);
	}
}

第三步:修改main.xml布局如下,由两个EditText和一个ListView组成,代码如下:

第四步:修改SQLiteDatabaseDemo.java代码如下:

package com.android.tutor;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class SQLiteDatabaseDemo extends Activity implements
		AdapterView.OnItemClickListener {
	private BooksDB mBooksDB;
	private Cursor mCursor;
	private EditText BookName;
	private EditText BookAuthor;
	private ListView BooksList;

	private int BOOK_ID = 0;
	protected final static int MENU_ADD = Menu.FIRST;
	protected final static int MENU_DELETE = Menu.FIRST + 1;
	protected final static int MENU_UPDATE = Menu.FIRST + 2;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		setUpViews();
	}

	public void setUpViews() {
		mBooksDB = new BooksDB(this);
		mCursor = mBooksDB.select();

		BookName = (EditText) findViewById(R.id.bookname);
		BookAuthor = (EditText) findViewById(R.id.author);
		BooksList = (ListView) findViewById(R.id.bookslist);

		BooksList.setAdapter(new BooksListAdapter(this, mCursor));
		BooksList.setOnItemClickListener(this);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);

		menu.add(Menu.NONE, MENU_ADD, 0, "ADD");
		menu.add(Menu.NONE, MENU_DELETE, 0, "DELETE");
		menu.add(Menu.NONE, MENU_DELETE, 0, "UPDATE");
		return true;
	}

	public boolean onOptionsItemSelected(MenuItem item) {
		super.onOptionsItemSelected(item);
		switch (item.getItemId()) {
		case MENU_ADD:
			add();
			break;
		case MENU_DELETE:
			delete();
			break;
		case MENU_UPDATE:
			update();
			break;
		}
		return true;
	}

	public void add() {
		String bookname = BookName.getText().toString();
		String author = BookAuthor.getText().toString();
		// 书名和作者都不能为空,或者退出
		if (bookname.equals("") || author.equals("")) {
			return;
		}
		mBooksDB.insert(bookname, author);
		mCursor.requery();
		BooksList.invalidateViews();
		BookName.setText("");
		BookAuthor.setText("");
		Toast.makeText(this, "Add Successed!", Toast.LENGTH_SHORT).show();
	}

	public void delete() {
		if (BOOK_ID == 0) {
			return;
		}
		mBooksDB.delete(BOOK_ID);
		mCursor.requery();
		BooksList.invalidateViews();
		BookName.setText("");
		BookAuthor.setText("");
		Toast.makeText(this, "Delete Successed!", Toast.LENGTH_SHORT).show();
	}

	public void update() {
		String bookname = BookName.getText().toString();
		String author = BookAuthor.getText().toString();
		// 书名和作者都不能为空,或者退出
		if (bookname.equals("") || author.equals("")) {
			return;
		}
		mBooksDB.update(BOOK_ID, bookname, author);
		mCursor.requery();
		BooksList.invalidateViews();
		BookName.setText("");
		BookAuthor.setText("");
		Toast.makeText(this, "Update Successed!", Toast.LENGTH_SHORT).show();
	}

	@Override
	public void onItemClick(AdapterView parent, View view, int position,
			long id) {

		mCursor.moveToPosition(position);
		BOOK_ID = mCursor.getInt(0);
		BookName.setText(mCursor.getString(1));
		BookAuthor.setText(mCursor.getString(2));

	}

	public class BooksListAdapter extends BaseAdapter {
		private Context mContext;
		private Cursor mCursor;

		public BooksListAdapter(Context context, Cursor cursor) {

			mContext = context;
			mCursor = cursor;
		}

		@Override
		public int getCount() {
			return mCursor.getCount();
		}

		@Override
		public Object getItem(int position) {
			return null;
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			TextView mTextView = new TextView(mContext);
			mCursor.moveToPosition(position);
			mTextView.setText(mCursor.getString(1) + "___"
					+ mCursor.getString(2));
			return mTextView;
		}

	}
}

第五步:运行程序效果如下:

程序效果1

程序效果2

程序效果3

程序效果4

程序效果5

程序效果6

第六步:查看我们所建的数据库。有两种方法:第一种用命令查看:adb shell ls data/data/com.android.tutor/databases。

另一种方法是用DDMS查看,在data/data下面对应的应用程序的包名 下会有如下数据库,如图所示:

File Explorer

由于代码都是现写,时间原因,没有全部加注释,如果大家有什么不懂的地方,可以留言。ok,今天就到这里,大家晚安!

暂无评论
  • 1:请一针见血的评论。
  • 2:评论需要审核通过后才能显示。
  • 3:评论字数限制在1000字以内。
  • 当前字数:0
热门文章
推荐文章
随机文章
关于本站 - 广告服务 - 版权声明 - 联系我们 - 友情链接 - 网站地图 - 帮助中心