編輯:關於Android編程
SQLite
SQLite是一種超輕量級的嵌入式數據庫,大小只有幾百KB,但是其語法支持標准SQL語法,同時還遵循了數據庫的ACID事務,所以學過其他數據庫的開發人員都很容易掌握其使用。
sql語法就不介紹了,直接看在android中的使用
SQLiteOpenHelper——封裝好的數據庫操作輔助類,需重寫
重寫方法
onCreate:初始化數據庫,創建表,添加初始數據
onUpgrade:數據庫版本升級時的數據庫操作,如備份刪除數據庫等
常用方法
getReadableDatabase() 獲取SQLiteDatabase對象,操作數據庫
getWritableDatabase() 獲取SQLiteDatabase對象,操作數據庫
區別:在磁盤空間滿或不可寫時,1方法將獲得只讀的數據庫對象,而2方法會報錯,在正常情況下,獲取到的都是可讀寫的數據庫對象。
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
private static final String name="my";//數據庫名
private static final int version=1;//版本號
//重寫構造方法的時候選擇參數少的一項
public DBHelper(Context context) {
//1:上下文 2:數據庫名稱 3:游標創建工廠 4:數據庫版本 版本只能是整數 1 2 3..
super(context, name, null, version);
}
//數據庫的初始化 SQLiteDatabase數據庫操作對象
//一般只在第一次運行和版本更新的時候調用
@Override
public void onCreate(SQLiteDatabase db) {
//創建數據庫 主鍵默認自增
db.execSQL("create table student(" +
"_id integer not null primary key autoincrement," +
"name varchar(20)," +
"phone varchar(11)," +
"gender varchar(2))");
//添加一條測試數據
db.execSQL("insert into student values(null,?,?,?)"
,new Object[]{"小黑","12345678901","男"});
}
/**
* 在版本升級的時候調用
* 修改version 為2 表示版本升級 就會調用這個方法
* @param db 數據庫操作對象
* @param oldVersion 舊版本號
* @param newVersion 新版本號
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
在android數據庫的創建是需要創建對象才能創建的
在activity類中創建出一個數據庫類對象
創建好數據對象就可以操作數據了 通過SQLiteDatabase獲取 兩種獲取方法的區別上面已經提到過了
//創建數據 DBHelper helper =new DBHelper(this); //調用數據操作對象 SQLiteDatabase dbWrite=helper.getWritableDatabase(); SQLiteDatabase dbRead=helper.getReadableDatabase();
SQLiteDatabase給我們提供了很多操作數據的方法
刪除:(int) delete(String table,String whereClause,String[] whereArgs)
table: 表名
whereClause:where條件 列名 占位符 id=?
whereArgs:參數值數組
添加:(long) insert(String table,String nullColumnHack,ContentValues values)
nullColumnHack:為空列
ContentValues values:通過鍵值對存儲添加的數據 key為列 value為值
insert方法 底層是通過拼接字符串的方式 如果ContentValues是空的 拼接成的sql語句無法執行會報錯 所以給一個可以為空的列當ContentValues為空時也可以執行 有興趣的可以看一下源碼
更新:(int) update(String table, ContentValues values, String whereClause, String[] whereArgs)
參數意思同上
查詢:(Cursor) query(boolean distinct,String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
返回值是一個游標 這個query參數較多 簡單的查詢就還是寫一條sql語句簡單點
boolean distinct 去重復
String table 表名
String[] columns要查詢的列
String selection查詢條件
String[] selectionArgs查詢參數值
String groupBy分組
String having分組條件
String orderBy排序
String limit分頁查詢限制
關閉數據庫:(void) close()
執行一條sql語句:(void) execSQL(String sql) 增刪改查
查詢查詢sql:(Cursor) rawQuery(String sql, String[] selectionArgs)
事務
try {
db.beginTransaction();//開啟事務
// db.update();
// db.insert();
db.setTransactionSuccessful(); //沒有設置事物成功 finally就會回滾
} catch (Exception e) {
e.printStackTrace();
}finally {
db.endTransaction();
}
貼代碼咯 執行sql語句 和封裝好的方法
查詢
private void query() {
StringBuffer sb=new StringBuffer("select * from student where 1=1");
//參數集合
List<String> params=new ArrayList<>();
if(!TextUtils.isEmpty(id)){
sb.append(" and _id=?");
params.add(id);
}
if(!TextUtils.isEmpty(phone)){
sb.append(" and phone=?");
params.add(phone);
}
if(!TextUtils.isEmpty(name)){
sb.append(" and name=?");
params.add(name);
}
if(!TextUtils.isEmpty(gender)){
sb.append(" and gender=?");
params.add(gender);
}
SQLiteDatabase db=helper.getReadableDatabase();
String [] projection=new String [params.size()];
params.toArray(projection);
//返回值 游標
Cursor cursor=db.rawQuery(sb.toString(),projection);
//判斷游標是否為空,是否有一個值
while(cursor!=null&&cursor.moveToNext()){
// getColumnIndex獲取列的下標 cursor.getXXXX()獲取指定列的值
String name=cursor.getString(cursor.getColumnIndex("name"));
Integer id=cursor.getInt(cursor.getColumnIndex("_id"));
}
}
用不到的參數就讓它為空吧 遍歷數據就while循環就好咯
Cursor c = db.query("student",null,null,null,null,null,null);//查詢並獲得游標
更新
private void update() {
StringBuffer sb=new StringBuffer("update student set ");
List params=new ArrayList();
if(!TextUtils.isEmpty(phone)){
sb.append("phone=?,");
params.add(phone);
}
if(!TextUtils.isEmpty(name)){
sb.append("name=?,");
params.add(name);
}
if(!TextUtils.isEmpty(gender)){
sb.append("gender=?,");
params.add(gender);
}
if (params.size()!=0){
//更新操作拼接字符串末尾有一個","需要去除
//刪除最後一位的“,”
sb.setLength(sb.length()-1);
sb.append(" where 1=1");
//通過id指定 更新那行數據
if(!TextUtils.isEmpty(id)){
sb.append(" and _id=?");
params.add(id);
}else{
Toast.makeText(this,"請填寫id",Toast.LENGTH_SHORT).show();
return;
}
SQLiteDatabase db=helper.getWritableDatabase();
Object [] o=new Object[params.size()];
params.toArray(o);//將數據存放到指定的數組中
db.execSQL(sb.toString(),o);
}
}
ContentValues cv = new ContentValues();//實例化ContentValues
cv.put("name","123");//添加要更改的字段及內容
String whereClause = "phone=?";//修改條件
String[] whereArgs = {"12312313213"};//修改條件的參數
db.update("student",cv,whereClause,whereArgs);//執行修改
刪除
private void delete() {
getAllText();
//拼接sql語句
StringBuffer sb=new StringBuffer("delete from student where 1=1");
//保存參數的list
List params=new ArrayList();
//判斷條件 動態拼接
if(!TextUtils.isEmpty(id)){
sb.append(" and _id=?");
params.add(id);
}
if(!TextUtils.isEmpty(phone)){
sb.append(" and phone=?");
params.add(phone);
}
if(!TextUtils.isEmpty(name)){
sb.append(" and name=?");
params.add(name);
}
if(!TextUtils.isEmpty(gender)){
sb.append(" and gender=?");
params.add(gender);
}
SQLiteDatabase db=helper.getWritableDatabase();
if (params.size()!=0){
Object [] o=new Object[params.size()];
params.toArray(o);//將數據存放到指定的數組中
//執行刪除
db.execSQL(sb.toString(),o);
}else{
db.execSQL(sb.toString());
}
Toast.makeText(this,"刪除完成",Toast.LENGTH_SHORT).show();
}
String whereClause = "name=?";//刪除的條件
String[] whereArgs = {"123"};//刪除的條件參數
db.delete("student",whereClause,whereArgs);//執行刪除
增加
private void insert() {//保存數據到object數組
Object [] o=new Object[]{name,phone,gender};
//獲取數據庫操作對象
SQLiteDatabase db=helper.getWritableDatabase();
//sql:sql語句 bingArgs:參數數組
db.execSQL("insert into student values(null,?,?,?)",o);
//關閉連接
db.close();
Toast.makeText(this,"增加成功",Toast.LENGTH_SHORT).show();
}
ContentValues cv = new ContentValues();//實例化一個ContentValues用來裝載待插入的數據
cv.put("name","123");
db.insert("student",null,cv);//執行插入操作
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持本站!
【Android開發—電商系列】(二):仿淘寶商品屬性標簽頁
一睹為快 需求 1.動態加載屬性,如尺碼,顏色,款式等 由於每件商品的屬性是不確定的,有的商品的屬性是顏色和尺碼,有的是口味,有的是大小,所以這些屬性不能直接
Android 仿微信圖像拍攝和選擇界面功能(代碼分享)
插件運行後的畫面如下:下面這張圖對圖像進行篩選,根據照片產生的源頭分(QQ和微信和相機)點擊某文件夾後,可以查看該文件夾下包含的所有的圖片圖片選擇界面選中後就
DELPHI XE Android 開發筆記
第一次編譯時,設定android SDK:F:\RAD Studio XE6\PlatformSDKs\adt-bundle-windows-x86-20131030\s
Android異步加載全解析之引入一級緩存
Android異步加載全解析之引入緩存為啥要緩存通過對圖像的縮放,我們做到了對大圖的異步加載優化,但是現在的App不僅是高清大圖,更是高清多圖,動不動就是圖文混排,以圖代
從源碼角度帶你分析 Android View 事件分發 dispatchTouchEvent,onTouch,onTouchEvent,onClick邏輯順序過程(一)
關於Android View 事件分發過程的文章網絡上可以搜到一把大,這