Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 客戶端數據庫(SQLite)

客戶端數據庫(SQLite)

編輯:關於Android編程

一提到數據庫,就不得不提sql語句,確實相對來說sql語句太容易出錯了,我們也應該更加的細心。為了方便,安卓倒是把sql語句封裝成一個方法,也更方便我們去操作,對此本文對sql不多加涉及前面的文章提到過持久化技術,SQLite也屬於其中一種,相對於SharedPreference它的優點在於能存儲更多的數據。

SQLite的有點有以下幾種:

1.支持標准的SQL語言

2.遵循了數據庫ACID的事務

3.輕量級的關系型數據庫

對於數據庫的操作無外乎增、刪、改、查,當然SQLite還支持事務(事務的特性就是保證讓某一系列的操作要麼全部完成,要麼一個都不會完成,如銀行轉賬)

下面貼一下代碼

package com.example.databasetext;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDatabaseHelper extends SQLiteOpenHelper {
	/**
	 * sql語句含義: primary key 主鍵 autoincrement 自增長 text 文本類型 real 浮點型 integer 整型
	 * blob 二進制型
	 */
	private static final String CREATE_BOOK = "create table Book("
			+ "id integer primary key autoincrement,"
			+ "author text,"
			+ "price real," 
			+ "pages integer," 
			+ "name text"
			+"category_id integer)";//用戶新要求增加的一列

	private static final String CREATE_CATRGORY = "create table Category" +
			"(id integer primary key autoincrement," +
			"category_name text," +
			"category_code integer)";

	Context context;

	public MyDatabaseHelper(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
		this.context = context;

	}
	
	/**
	 * 創建表格
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(CREATE_BOOK);
		db.execSQL(CREATE_CATRGORY);
//		Toast.makeText(context, "Create succeeded", Toast.LENGTH_SHORT).show();
	}
	
	/**
	 * 更新表格
	 * 如何執行onUpgrade()方法,在構造方法中,版本的參數,大於之前輸入的參數即可
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		/**
		 * DROP語句,如果數據庫已經存在Book或者Category表格,就將他們刪除
		 * 再重新調用onCreate()創建表格
		 * 如果不刪除,出現已經存在的表格就會報錯。
		 * 這種方式會造成數據丟失
		 */
//		db.execSQL("drop table if exists Book");
//		db.execSQL("drop table if exists Category");
//		onCreate(db);
		/**
		 * 最佳的更新表格的方式
		 * 注意!!!!不要用break,要保證跨版升級的時候,每一次的數據庫修改都能被全部執行到 
		 * 這樣可以保證數據庫的表結構是最新的,而且表中的數據也不會丟失
		 */
		switch (oldVersion) {
		case 1://如果當前版本是1,只會創建一張 Catrgory表,如果直接安裝第二版的話,會兩張表一起創建
			//當用戶是使用第二版覆蓋第一版的時候,就只會創建Catrgort表
			db.execSQL(CREATE_CATRGORY);
		case 2://使用alter命令為Book表增加一個category_id列
			db.execSQL("alter table Bood add colum category_id integer");
		default:
		}
	}

}
關於最佳的更新表格方式,詳見郭霖大神的《第一行代碼》

 

 

package com.example.databasetext;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class MainActivity extends Activity {

	private MyDatabaseHelper dbHelper;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		dbHelper = new MyDatabaseHelper(this, "BookStore", null, 2);
		Button button = (Button) findViewById(R.id.create_database);
		Button addData = (Button) findViewById(R.id.add_data);
		Button updateData = (Button) findViewById(R.id.update_data);
		Button deleteData = (Button) findViewById(R.id.delete_data);
		Button queryData = (Button) findViewById(R.id.query_data);
		Button replaceData = (Button) findViewById(R.id.replace_data);
		/**
		 * 新建或更新數據庫的點擊事件
		 */
		button.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				dbHelper.getWritableDatabase();
			}
		});
		/**
		 * 添加數據的點擊事件
		 */
		addData.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// 獲取SQLiteDatabase對象
				SQLiteDatabase db = dbHelper.getWritableDatabase();
				// insert添加數據的第三個參數,用於添加數據
				ContentValues values = new ContentValues();
				// 開始組裝第一條數據
				values.put("name", "The Da Vinci Code");
				values.put("author", "Dan Brown");
				values.put("pages", "454");
				values.put("price", "16.96");
				/**
				 * 第一個參數為表,第二個參數一般為null,第三個參數用來添加數據
				 */
				db.insert("Book", null, values);
				values.clear();
				// 開始組裝第二條數據
				values.put("name", "The Lost Symbol");
				values.put("author", "Dan Brown");
				values.put("pages", "510");
				values.put("price", "19.95");
				db.insert("Book", null, values);
			}
		});

		/**
		 * 更新數據的點擊事件
		 */
		updateData.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				SQLiteDatabase db = dbHelper.getWritableDatabase();
				ContentValues values = new ContentValues();
				values.put("price", 10.99);
				/**
				 * 第三個參數對應的是SQL語句的where部分,表示去更新所有name=?的行。?是一個占位符
				 * 可以通過第四個參數提供的字符串數組為第三個參數中的每個占位符指定相應的內容
				 * 不指定就更新所以行
				 */
				db.update("Book", values, "name = ?",
						new String[] { "The Da Vinci Code" });
			}
		});
		
		/**
		 * 刪除數據的點擊事件
		 */
		deleteData.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				SQLiteDatabase db = dbHelper.getWritableDatabase();
				db.delete("Book", "pages>?", new String[]{"500"});
			}
		});
		
		/**
		 * 查詢數據的點擊事件
		 */
		queryData.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				SQLiteDatabase db = dbHelper.getWritableDatabase();
				//查詢Book表中所有數據
				Cursor cursor = db.query("Book", null, null, null, null, null, null);
				if (cursor.moveToFirst()) {//將光標設置到第一行,即從第一行開始讀取數據
					do {
						//遍歷所有Cursor對象,取出數據並打印
						//通過getColumnIndex的索引獲取數據
						String name = cursor.getString(cursor.getColumnIndex("name"));
						String author = cursor.getString(cursor.getColumnIndex("author"));
						String pages = cursor.getString(cursor.getColumnIndex("pages"));
						String price = cursor.getString(cursor.getColumnIndex("price"));
						Log.d("MainActivity", "book name is "+ name);
						Log.d("MainActivity", "book author is "+ author);
						Log.d("MainActivity", "book pages is "+ pages);
						Log.d("MainActivity", "book price is "+ price);
					} while (cursor.moveToNext());//當不能再讀取下一行的時候結束循環
				}
				cursor.close();//要關閉cursor
			}
		});
		
		/**
		 * 事務的點擊事件
		 * 使用事物替換後的數據,主鍵依然會自增長,如果最後的數據是9,就會增長為10
		 * 如果最後的數據是刪除掉的10,也會增長為11
		 */
		replaceData.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				SQLiteDatabase db = dbHelper.getWritableDatabase();
				db.beginTransaction();//開啟事務
				try {
					db.delete("Book", null, null);//刪除所有行的數據
					if (true) {
						//這裡手動拋出一個異常,讓事務失敗
//						throw new NullPointerException();
					}
					ContentValues values = new ContentValues();
					values.put("name", "Game of Thrones");
					values.put("author", "George Martin");
					values.put("pages", 720);
					values.put("price", 20.85);
					db.insert("Book", null, values);
					db.setTransactionSuccessful();//事務已經執行成功
				} catch (Exception e) {
					e.printStackTrace();
				}finally{
					db.endTransaction();//結束事務
				}
			}
		});
	}

}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved