SQL學習筆記之數據庫專題(二):Android下SQL數據庫開發

在Android開發 中,數據庫是不可缺少的。在Android開發中,用的是一種小型的嵌入式數據庫,sqllite。今天會寫兩篇關於Android開發環境下數據庫開發的文章,第一篇先介紹使用android自帶的API來實現數據庫的使用和管理以及增刪改查、數據庫升級的相關操作。


一、數據庫第一次生成

1、javabean文件的準備

這裏以一個Person類爲例子來描述
package com.example.freedomsql.bean;

import java.io.Serializable;

/**
 * @ClassName: Person
 * @author victor_freedom ([email protected])
 * @createddate 2015-1-10 下午4:22:09
 * @Description: TODO
 */
public class Person implements Serializable {
	private int id;
	private String name;
	private String number;

	// private String nickname;

	public Person(int id, String name, String number) {
		super();
		this.id = id;
		this.name = name;
		this.number = number;
		// this.nickname = nickname;
	}

}

2、數據庫類的編寫

要實現一個數據庫的使用,需要新建一個類並繼承SQLiteOpenHelper類。然後實現一個構造方法,詳情看代碼
package com.example.freedomsql.db;

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

/**
 * @ClassName: FreedomDB
 * @author victor_freedom ([email protected])
 * @createddate 2015-1-10 下午2:49:15
 * @Description: TODO
 */
public class FreedomDB extends SQLiteOpenHelper {

	public FreedomDB(Context context) {
		// 參數依次爲:上下文,數據庫名稱,遊標工廠一般爲NULL,數據庫版本號,升級的時候需要更改
		super(context, "freedom.db", null, 1);
	}

	/**
	 * 第一次創建數據庫的時候觸發該方法
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		//sql語句詳情請參考該系列文章第一篇
		db.execSQL("create table person (id integer primary key autoincrement,name varchar(20),number varchar(20))");
	}

	/**
	 * 數據庫版本號變化的時候觸發該方法
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
		// if (oldversion == 1 && newversion == 2) {
		// db.execSQL("alter table person add nickname varchar(20)");
		// }
	}
}

3、數據庫操作類dao類編寫

數據庫創建完成之後,需要有一個操作類來實現對數據庫的操作,一般命名爲dao類。詳情請參考代碼:
package com.example.freedomsql.db.dao;

import java.util.ArrayList;
import java.util.List;

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

import com.example.freedomsql.bean.Person;
import com.example.freedomsql.db.FreedomDB;

/**
 * @ClassName: PersonDao
 * @author victor_freedom ([email protected])
 * @createddate 2015-1-10 下午2:30:24
 * @Description: TODO
 */
public class PersonDao {
	private FreedomDB dbHelper;

	public PersonDao(Context context) {
		dbHelper = new FreedomDB(context);

	}

	/**
	 * @Title: add
	 * @Description:增加
	 * @param name
	 * @param number
	 * @throws
	 */
	public void add(String name, String number) {
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		db.execSQL("insert into person(name,number) values (?,?)",
				new Object[] { name, number });
		db.close();
		// 系統API
		// ContentValues = values = new ContentValues();
		// values.put("name",name);
		// values.put("number",number);
		// long id = db.insert(table(表名),null,values(數據));
		// return id;

	}

//	/**
//	 * @Title: add
//	 * @Description: 升級後的增加方法
//	 * @param name
//	 * @param number
//	 * @param nickname
//	 * @throws
//	 */
//	public void add(String name, String number, String nickname) {
//		SQLiteDatabase db = dbHelper.getWritableDatabase();
//		db.execSQL("insert into person(name,number,nickname) values (?,?,?)",
//				new Object[] { name, number, nickname });
//		db.close();
//		// 系統API
//		// ContentValues = values = new ContentValues();
//		// values.put("name",name);
//		// values.put("number",number);
//		// long id = db.insert(table(表名),null,values(數據));
//		// return id;
//
//	}

	/**
	 * @Title: delete
	 * @Description: 刪除
	 * @param name
	 * @throws
	 */
	public void delete(String name) {
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		db.execSQL("delete from person where name=?", new Object[] { name });

		// 系統API
		// int number=db.delete("person","name=?",new String[]{name});
		db.close();
	}

	/**
	 * @Title: updata
	 * @Description: 更新
	 * @param name
	 * @param newnumber
	 * @throws
	 */
	public void updata(String name, String newnumber) {
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		db.execSQL("update person set number=? where name=?", new Object[] {
				newnumber, name });
		// 系統API
		// ContentValues values = new ContentValues();
		// values.put("number", newnumber);
		// int num = db.update("person", values, "name=?", new String[] { name
		// });
		db.close();
	}

	/**
	 * @Title: find
	 * @Description: 查詢
	 * @param name
	 * @return
	 * @throws
	 */
	public boolean find(String name) {
		SQLiteDatabase db = dbHelper.getReadableDatabase();

		Cursor cursor = db.rawQuery("select * from person where name =?",
				new String[] { name });
		// 系統API
		// Cursor cursor = db.query(table(表名),null,"name=?",new
		// String[](name),null,null,null);
		boolean result = cursor.moveToNext();
		cursor.close();
		db.close();
		return result;

	}

	/**
	 * @Title: findAll
	 * @Description:查詢
	 * @return
	 * @throws
	 */
	public List<Person> findAll() {
		List<Person> persons = new ArrayList<Person>();
		SQLiteDatabase db = dbHelper.getReadableDatabase();
		Cursor cursor = db.rawQuery("select * from person", null);
		// 系統API
		// Cursor cursor= db.query("Person",new
		// String[]{"name","id","number"},null,null,null,null,null);

		while (cursor.moveToNext()) {
			int id = cursor.getInt(cursor.getColumnIndex("id"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			String number = cursor.getString(cursor.getColumnIndex("number"));
			// String nickname = cursor.getString(cursor
			// .getColumnIndex("nickname"));
			Person p = new Person(id, name, number);
			persons.add(p);
		}
		cursor.close();
		db.close();
		return persons;

	}
}

4、主Activity內代碼

在activity內我們使用dao類對數據庫進行操作。
package com.example.freedomsql;

import com.example.freedomsql.db.dao.PersonDao;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		PersonDao dao = new PersonDao(getBaseContext());
		dao.add("湯老闆", "110");
		dao.add("郭大俠", "119");
		// dao.add("湯老闆1", "110", "湯老闆");
		// dao.add("郭大俠1", "119", "郭女俠");
	}
}
這裏只對插入數據進行了操作,有興趣的同學可以自己測試其他的操作也可以在dao類寫其他的方法進行更復雜的操作。代碼執行後數據庫內容顯示如圖

二、數據庫升級更新

在實際開發中,數據庫肯定會有升級相關的操作,但是,數據庫的升級自然不可以讓項目之前的數據清掉,必須保留,所以,這需要對數據庫版本號進行一定的控制和處理。那麼我們來對剛剛的數據庫進行升級處理

1、person類的升級,增加一個nickname字段

package com.example.freedomsql.bean;

import java.io.Serializable;

/**
 * @ClassName: Person
 * @author victor_freedom ([email protected])
 * @createddate 2015-1-10 下午4:22:09
 * @Description: TODO
 */
public class Person implements Serializable {
	private int id;
	private String name;
	private String number;
	private String nickname;

	public Person(int id, String name, String number, String nickname) {
		super();
		this.id = id;
		this.name = name;
		this.number = number;
		this.nickname = nickname;
	}

}

2、數據庫生成類的改動

1、將版本號更改爲2
	public FreedomDB(Context context) {
		// 參數依次爲:上下文,數據庫名稱,遊標工廠一般爲NULL,數據庫版本號,升級的時候需要更改
		super(context, "freedom.db", null, 2);
	}


2、在onUpgrade方法中進行處理,在實際開發中,特別需要對版本號進行邏輯處理。
	/**
	 * 數據庫版本號變化的時候觸發該方法
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
		if (oldversion == 1 && newversion == 2) {
			db.execSQL("alter table person add nickname varchar(20)");
		}
	}

3、Dao類的修改

1、增加方法的改動
/**
	 * @Title: add
	 * @Description: 升級後的增加方法
	 * @param name
	 * @param number
	 * @param nickname
	 * @throws
	 */
	public void add(String name, String number, String nickname) {
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		db.execSQL("insert into person(name,number,nickname) values (?,?,?)",
				new Object[] { name, number, nickname });
		db.close();
		// 系統API
		// ContentValues = values = new ContentValues();
		// values.put("name",name);
		// values.put("number",number);
		// long id = db.insert(table(表名),null,values(數據));
		// return id;

	}

2、查詢方法的改動
	/**
	 * @Title: findAll
	 * @Description:查詢
	 * @return
	 * @throws
	 */
	public List<Person> findAll() {
		List<Person> persons = new ArrayList<Person>();
		SQLiteDatabase db = dbHelper.getReadableDatabase();
		Cursor cursor = db.rawQuery("select * from person", null);
		// 系統API
		// Cursor cursor= db.query("Person",new
		// String[]{"name","id","number"},null,null,null,null,null);

		while (cursor.moveToNext()) {
			int id = cursor.getInt(cursor.getColumnIndex("id"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			String number = cursor.getString(cursor.getColumnIndex("number"));
			String nickname = cursor.getString(cursor
					.getColumnIndex("nickname"));
			Person p = new Person(id, name, number,nickname);
			persons.add(p);
		}
		cursor.close();
		db.close();
		return persons;

	}

4、主Activity的修改

package com.example.freedomsql;

import com.example.freedomsql.db.dao.PersonDao;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		PersonDao dao = new PersonDao(getBaseContext());
		dao.add("湯老闆1", "110", "湯老闆");
		dao.add("郭大俠1", "119", "郭女俠");
	}
}

這樣就完成了對數據庫升級之後的操作,我們來看下升級後的數據庫內容
從圖我們可以看到,之前有的數據還存在,沒有清除掉,新增加的字段增加進去了,新創建的對象也創建成功。

在Android開發中sqlite數據庫的基礎操作介紹完畢,當然,在實際開發中,我們不會這樣去操作,有很多封裝好了的框架給我們去使用,而且性能極大的優化,操作簡便。學習這些基礎開發,是爲了讓我們更加清晰的知道數據庫底層的操作原理。所有的數據庫操作框架基本上都是基於這套理論去實現的。瞭解這些後我們再去學習框架的使用,會容易上手。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章