android SQLite資料庫總結

来源:http://www.cnblogs.com/r-decade/archive/2016/09/13/5870117.html
-Advertisement-
Play Games

SQLite SQLite是一種超輕量級的嵌入式資料庫,大小隻有幾百KB,但是其語法支持標準SQL語法,同時還遵循了資料庫的ACID事務,所以學過其他資料庫的開發人員都很容易掌握其使用。 sql語法就不介紹了,直接看在android中的使用 SQLiteOpenHelper——封裝好的資料庫操作輔助 ...


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);//執行插入操作

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • getElementsByClassName是通過class來獲取DOM,但是IE8及以下不能相容。這裡做了一下相容性。 HTML: 相容JS: 測試: 結果: IE7谷歌火狐 ...
  • “正則表達式”描述在搜索文本正文時要匹配的一個或多個字元串。 該表達式可用作一個將字元模式與要搜索的字元串相匹配的模板。 正則表達式包括普通字元(例如,a 到 z 之間的字母)和特殊字元(稱為“元字元”)。 特殊字元 若要匹配這些特殊字元之一,必須首先轉義字元,即,在字元前面加反斜杠字元 (\)。  ...
  • 在資料庫獲取一些新聞時,有時文字過多,為了不破壞佈局,常常需要只顯示一部分,這是需要用到文字截斷的功能。雖然css也可以實現,但是限制太多 css實現需要text-overflow:ellipsis;overflow:hidden;white-space:nowrap;三個屬性,另外還需要文本標簽寬 ...
  • CSS3實現輪播圖主要是由css:background-position和css3:animation實現。且實現此輪播需要一張四個圖橫著相連的圖片。 註(Internet Explorer 10、Firefox 以及 Opera 支持 animation 屬性。Safari 和 Chrome 支持 ...
  • 給自己定一個小目標,一個禮拜完成100個inkscape案例。 今天完成picture on the wall ...
  • 前言: 最近一個多月在認真的學習Android和做項目,文章內容表達的不好或者理解錯了,希望大家評論指出。 :-) 本文是總結幾個比較常用且使用的技巧,和一個大家都會遇到的問題。 文章中大部分語句摘抄自一下兩篇大神寫的文章:(如果對ExpandableListView一無所知,建議按照順序去閱讀,遇 ...
  • 為什麼要用Kotlin,和Java完全相容,相互之間引用完全不是問題,所有沒有什麼負擔。 使用Kotlin已經近一個月,基本上看完了語法就上正式項目了,期間幾次準備放棄,最終堅持下來了。關於Kotlin的優點,不必多說了,基於這一個月的經驗,來說說Kotlin的入門和坑。 配置工程 添加依賴 作為一 ...
  • API 23之前的版本都是自動獲取許可權,而從 Android 6.0 開始添加了許可權申請的需求,更加安全。 這裡以單個存儲許可權為例: · 在 Manifest 中添加訪問許可權:(只需設置可寫,因為可寫必定可讀) · 動態申請許可權的過程: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...