編輯:關於Android編程
上一節簡單介紹了一下SQLite,這一節我們開始SQLite在Android中的應用。
Android提供了一個數據庫的幫助類 SQLiteOpenHelper
,用於管理數據庫的創建和版本管理。我們可以繼承這個類,實現它的 onCreate
和 onUpgrade
方法。我們可以在這裡設置數據庫的版本,數據庫名稱,創建數據庫表等。下面看代碼:
public class DBHelper extends SQLiteOpenHelper {
//數據庫的版本號必須要大於1
public final static int DB_VERSION = 1;
//數據庫的名稱
public final static String DB_NAME = "user.db";
//數據庫表名
public final static String TABLE_NAME = "userInfo";
public static DBHelper helper = null;
public static DBHelper getHelper() {
if (helper == null) {
helper = new DBHelper(App.getContext());
}
return helper;
}
private DBHelper(Context context) {
//調用父類方法創建數據庫,CusorFactory 一般為空,使用默認的
//CursorFactory對象,用來構造查詢完畢時返回的Cursor的子類對象,為null時使用默認的CursorFactory構造。
super(context, DB_NAME, null, DB_VERSION);
}
/**
* 數據庫第一次創建時調用,我們在這裡執行一些數據庫表的創建,初始化等操作
*/
@Override
public void onCreate(SQLiteDatabase db) {
createTableUser(db);
}
/**
* 當數據庫更新時調用,我們可以在升級時執行數據庫修改;比 如修改表,刪除表,添加表等。
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion > oldVersion) {
dropTableUser(db);
createTableUser(db);
}
}
private void createTableUser(SQLiteDatabase db) {
String sql = "CREATE TABLE " + TABLE_NAME + "(_id integer primary key autoincrement ,NAME TEXT,AGE INT,ADDRESS TEXT);";
db.execSQL(sql);
}
private void dropTableUser(SQLiteDatabase db) {
String sql = "drop table if exists " + TABLE_NAME;
db.execSQL(sql);
}
}
當我們創建好我們數據庫幫助類後,我們就可以通過它來進行數據庫的操作了。當然我們也可以把一些數據庫 增、刪、改、查 的方法放到這個數據庫幫助類裡。
往數據庫表裡插入數據一般有兩種方式,一個是使用 SQL語句,一個是使用Android 提供的insert方法。
使用SQL語句,我們首先需要組拼一下我們的SQL語句,我們使用StringBuilder:
StringBuilder sql = new StringBuilder();
sql.append("insert into " + DBHelper.TABLE_NAME + "(name,age,address) values(")
.append(" '張三'").append(",")
.append("20").append(",")
.append("'火星" + i + "號'")
.append(" );")
然後 使用數據庫的 execSQL 執行這個SQL語句。
mDatabase.execSQL(sql.toString());
使用Android 提供的insert方法,需要用到另一個對象ContentValues,它類似於Map,以鍵值對的形式保存數據,鍵代表的是表的列名,值代表該列插入的值。具體使用如下。
ContentValues values = new ContentValues();
values.put("name", "張三");
values.put("age", 20);
values.put("address", "火星1號");
然後調用insert方法:
mDatabase.insert(DBHelper.TABLE_NAME, null, values);
組拼SQL:
StringBuilder builder = new StringBuilder();
builder.append(" delete from ").append(DBHelper.TABLE_NAME).append(" where _id = ?");
大家應該注意到 SQL 語句末尾的where語句的條件是’?’,這裡的’?’起到的是占位符的作用,我們在下面需要使用 “String[]”來填入具體的值,比如這裡我們可以:
String[] bindArgs = {"1"};
然後我們調用數據庫的 execSQL
方法來執行數據的刪除:
mDatabase.execSQL(builder.toString(), bindArgs);
它執行的SQL 語句相當於:
delete from userInfo where _id = 1 ;
當然我們也可以自己把條件值直接組拼成String語句。
Android 提供的delete方法需要提供表名,where子句,where子句的條件,並且這個方法返回的是delete影響到的行數。
//where子句
String whereClause = "_id = ?";
//where字句裡的裡占位符的值
String[] whereArgs = {"1"};
int affectedRows = mDatabase.delete(DBHelper.TABLE_NAME, whereClause, whereArgs);
首先我們組拼SQL語句:
StringBuilder builder = new StringBuilder();
builder.append("update ").append(DBHelper.TABLE_NAME).append(" set name=?,age=?,address=? where _id=?;");
然後定義數組來表示 set 子句中 ‘?’占位符的值:
Object[] bindArgs = {"趙六", 13, "水星1號", 5};
然後我們調用數據庫的 execSQL
方法來執行數據的更新:
mDatabase.execSQL(builder.toString(), bindArgs);
使用Android提供的update 方法,需要用到ContentValues對象,來確定需要更新的列和值。
ContentValues values = new ContentValues();
values.put("name", "錢八");
values.put("age", 15);
values.put("address", "水星2號");
然後我們需要准備好,where子句和where子句中占位的值:
String whereClause = "_id=?";
String[] whereArgs = {"4"};
然後調用數據庫的update方法執行更新數據的操作:
mDatabase.update(DBHelper.TABLE_NAME, values, whereClause, whereArgs);
Android 查詢數據庫的結果返回到一個Cursor 對象裡。它會定位到第一行之前。所有的數據都是通過下標取得。
首先我需要組拼SQL語句:
StringBuilder builder = new StringBuilder();
builder.append(" select * from ").append(DBHelper.TABLE_NAME);
然後調用數據庫的 rawQuery
方法來執行查詢,它會返回一個Cursor:
Cursor cursor = mDatabase.rawQuery(builder.toString(), null);
由於Cursor獲取數據都是通過下標來獲取的,Cursor專門提供了一個通過列表獲取下標的方法:
cursor.getColumnIndex(列名);
Cursor 定位是定在第一行之前的我們需要調用 moveToNext()定位到第一行,當然還有很多move開頭方法,大家可以多研究一下。
這樣我們就可以使用循環來獲取我們需要的內容了,我們把數據表裡的內容都保存到List裡面。
List users = new ArrayList<>();
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
String address = cursor.getString(cursor.getColumnIndex("address"));
User user = new User(name, age, address);
users.add(user);
}
最後 我們的Cursor對象需要 close 方法,把資源釋放掉。
cursor.close();
我們需要提供需要查詢的列名:
String[] columns = {"name", "age", "address"};
where條件:
String selection = "_id=?";
where 條件中 ‘?’的替代值:
String[] selectionArgs = {"1"};
我們調用query方法來執行查詢:
Cursor cursor = mDatabase.query(DBHelper.TABLE_NAME, columns, selection, selectionArgs, null, null, null);
其中後面的三個數分別為 groupBy子句,having子句,orderBy子句,如果有這些需求可以自己定義。
然後我們再把數據從Cursor裡取出來,放到List裡。
List users = new ArrayList<>();
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
String address = cursor.getString(cursor.getColumnIndex("address"));
User user = new User(name, age, address);
users.add(user);
}
最後關閉 Cursor,釋放資源:
cursor.close();
全部代碼如下:
public class DBHelper extends SQLiteOpenHelper { //數據庫的版本號必須要大於1 public final static int DB_VERSION = 1; //數據庫的名稱 public final static String DB_NAME = "user.db"; //數據庫表名 public final static String TABLE_NAME = "userInfo"; public static DBHelper helper = null; public SQLiteDatabase mDatabase; public static DBHelper getHelper() { if (helper == null) { helper = new DBHelper(App.getContext()); } return helper; } /** * 通過SQLiteOpenerHelper創建數據庫表, * <p/> * getWritableDatabase 與 getReadableDatabase 的區別 * <p/> * getWritableDatabase取得的實例不是僅僅具有寫的功能,而是同時具有讀和寫的功能 * 同樣的,getReadableDatabase 取得的實例也是具對數據庫進行讀和寫的功能 * 兩者的區別在於 * getWritableDatabase取得的實例是以讀寫的方式打開數據庫,如果打開的數據庫磁盤滿了,此時只能讀不能寫,此時調用了getWritableDatabase的實例,那麼將會發生錯誤(異常) * getReadableDatabase取得的實例是先調用getWritableDatabase以讀寫的方式打開數據庫,如果數據庫的磁盤滿了,此時返回打開失敗,繼而用getReadableDatabase的實例以只讀的方式去打開數據庫 */ private DBHelper(Context context) { //調用父類方法創建數據庫,CusorFactory 一般為空,使用默認的 //CursorFactory對象,用來構造查詢完畢時返回的Cursor的子類對象,為null時使用默認的CursorFactory構造。 super(context, DB_NAME, null, DB_VERSION); //獲取數據庫對象。 mDatabase = getReadableDatabase(); // mDatabase = getWritableDatabase(); } /** * 數據庫第一次創建時調用,我們在這裡執行一些數據庫表的創建,初始化等操作 */ @Override public void onCreate(SQLiteDatabase db) { createTableUser(db); } /** * 當數據庫更新時調用,我們可以在升級時執行數據庫修改;比如修改表,刪除表,添加表等。 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (newVersion > oldVersion) { dropTableUser(db); createTableUser(db); } } public void createTableUser(SQLiteDatabase db) { String sql = "CREATE TABLE " + TABLE_NAME + "(_id integer primary key autoincrement ,NAME TEXT,AGE INT,ADDRESS TEXT);"; db.execSQL(sql); } public void dropTableUser(SQLiteDatabase db) { String sql = "drop table if exists " + TABLE_NAME; db.execSQL(sql); } /** * 查看是否存在某個數據庫表 * <p/> * sqlite_master: SQLite數據庫都有一個叫 SQLITE_MASTER 的表, 它定義數據庫的模式,這個表是只讀的 * * @param tableName * @return */ public boolean isTableExist(String tableName) { String sql = "SELECT COUNT(*) AS c FROM sqlite_master WHERE type='table' AND name='" + tableName + "'"; Cursor cursor = mDatabase.rawQuery(sql, null); if (cursor.moveToNext()) { int count = cursor.getInt(0); if (count > 0) { return true; } } return false; } /** * 使用SQL 實現插入 */ public void insertWithSQL() { SQLiteDatabase db = mDatabase; db.beginTransaction(); try { for (int i = 0; i < 10; i++) { StringBuilder sql = new StringBuilder(); sql.append("insert into " + DBHelper.TABLE_NAME + "(name,age,address) values(") .append(" '張三'").append(",") .append("20").append(",") .append("'火星" + i + "號'") .append(" );"); db.execSQL(sql.toString()); } db.setTransactionSuccessful(); } finally { db.endTransaction(); } } /** * 使用 ContentValues 實現插入數據 */ public void insert() { ContentValues values = new ContentValues(); values.put("name", "張三"); values.put("age", 20); values.put("address", "火星1號"); mDatabase.insert(DBHelper.TABLE_NAME, null, values); } /** * 使用SQL 語句刪除數據 */ public void deleteBySQL() { StringBuilder builder = new StringBuilder(); builder.append(" delete from ").append(DBHelper.TABLE_NAME).append(" where _id = ?"); String[] bindArgs = {"1"}; mDatabase.execSQL(builder.toString(), bindArgs); } /** * 使用Android 提供的delete 方法 * * @return */ public int delete() { //where子句 String whereClause = "_id = ?"; //where字句裡的裡占位符的值 String[] whereArgs = {"1"}; int affectedRows = mDatabase.delete(DBHelper.TABLE_NAME, whereClause, whereArgs); return affectedRows; } /** * 使用SQL修改數據 */ public void updateBySQL() { StringBuilder builder = new StringBuilder(); builder.append("update ").append(DBHelper.TABLE_NAME).append(" set name=?,age=?,address=? where _id=?;"); Object[] bindArgs = {"趙六", 13, "水星1號", 5}; mDatabase.execSQL(builder.toString(), bindArgs); } /** * 使用Android 提供的update方法修改數據 */ public void update() { ContentValues values = new ContentValues(); values.put("name", "錢八"); values.put("age", 15); values.put("address", "水星2號"); String whereClause = "_id=?"; String[] whereArgs = {"4"}; mDatabase.update(DBHelper.TABLE_NAME, values, whereClause, whereArgs); } /** * 使用 SQL 實現查詢所有數據 */ public void queryDataBySql() { StringBuilder builder = new StringBuilder(); builder.append(" select * from ").append(DBHelper.TABLE_NAME); Cursor cursor = mDatabase.rawQuery(builder.toString(), null); List<User> users = new ArrayList<>(); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); String address = cursor.getString(cursor.getColumnIndex("address")); User user = new User(name, age, address); users.add(user); } LogUtils.e(users + ""); cursor.close(); } /** * 使用 SQL 實現查詢某條數據 */ public void queryDataBySql1() { StringBuilder builder = new StringBuilder(); builder.append(" select name,age,address from ").append(DBHelper.TABLE_NAME).append(" where _id = ?"); String[] selectArgs = {"1"}; Cursor cursor = mDatabase.rawQuery(builder.toString(), selectArgs); List<User> users = new ArrayList<>(); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); String address = cursor.getString(cursor.getColumnIndex("address")); User user = new User(name, age, address); users.add(user); } LogUtils.e(users + ""); cursor.close(); } /** * 使用Android提供的 query 方法 ,實現查詢所有數據 */ public void queryAll() { Cursor cursor = mDatabase.query(DBHelper.TABLE_NAME, null, null, null, null, null, null); List<User> users = new ArrayList<>(); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("NAME")); int age = cursor.getInt(cursor.getColumnIndex("AGE")); String address = cursor.getString(cursor.getColumnIndex("ADDRESS")); User user = new User(name, age, address); users.add(user); } LogUtils.e(users + ""); cursor.close(); } /** * 使用Android提供的 query 方法 ,實現查詢某條數據 */ public void query() { //想要查詢的那些列 String[] columns = {"name", "age", "address"}; //where條件 String selection = "_id=?"; //where 條件中 '?'的替代值 String[] selectionArgs = {"1"}; Cursor cursor = mDatabase.query(DBHelper.TABLE_NAME, columns, selection, selectionArgs, null, null, null); List<User> users = new ArrayList<>(); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); String address = cursor.getString(cursor.getColumnIndex("address")); User user = new User(name, age, address); users.add(user); } LogUtils.e(users + ""); cursor.close(); } }
本文實例為大家分享了Android九宮格圖片展示的具體代碼,供大家參考,具體內容如下MainActivity.java代碼:package siso.ninegridim
一、前言最近在學習HTML5相關的知識,發現前端技術的功能越來越強大了,很多功能如果我們通過原生代碼的形式進行實現的話相對於H5會花費數倍的時間,在最求快速迭代的時候是不
最近有很多朋友問我,android6.0下載文件怎樣設置文件的保存路徑。今天就把android6.0下載文件路徑設置總結一下。在android 6.0以前,你可以只關注外
先上圖看一下鬧鐘喚期頁面的效果實現的功能:1:轉動的圖片根據天氣情況更換2:轉動時間可以設置,轉動結束,鬧鈴聲音就結束3:光圈顏色漸變效果直接上代碼啦:package c