利用SQLite在android上實現增刪改查

来源:http://www.cnblogs.com/Renyi-Fan/archive/2017/08/27/7441962.html
-Advertisement-
Play Games

利用SQLite在android上實現增刪改查 方法: 一、直接利用database.execSQL()方法輸入完整sql語句進行操作 這種方法適用於複雜的sql語句,比如多表查詢等等 這裡適合於增刪改,這個方法沒有返回值,而查需要返回數據,故不適用 增實例: database.execSQL("i ...


利用SQLite在android上實現增刪改查

方法:

一、直接利用database.execSQL()方法輸入完整sql語句進行操作

  這種方法適用於複雜的sql語句,比如多表查詢等等

  這裡適合於增刪改,這個方法沒有返回值,而查需要返回數據,故不適用

  增實例:

    database.execSQL("insert into student (name,age) values ('小李',45)");

  查的話用database.rawQuery()方法,也是我們直接輸入完整的sql語句

  查實例:

    Cursor cursor = database.rawQuery("select id,name,age from student where name=?",new String[] { "小李" });

 

二、利用系統直接封裝好的API,原理是系統內部把參數拼成sql語句

  適用於簡單sql語句

  增: 返回操作的行

    long row=database.insert("student", null, values);

  刪: 返回受影響的行數

    int n = database.delete("student", "name=? and age=?", new String[] {"飯飯", "20" });

  改: 返回受影響的行數

    int n = database.update("student", values, "name=?",new String[] { "飯飯" });

  查: 返回數據表游標 (註意查不是select)

    Cursor cursor = database.rawQuery("select id,name,age from student where name=?",new String[] { "小李" });

 

三、其它

1、資料庫的連接有限,所以創建連接用完要關閉

2、將我們需要操作的數據寫入ContentValues

3、查數據時,游標通過cursor.moveToNext()方法來確定下一行是否有值,有值就讀取下一行的值

4、得到列的索引有兩種方法:

  通過查找列欄位對應的位置得到

    int id = cursor.getInt(cursor.getColumnIndex("id"));

  直接通過列號得到

    String name = cursor.getString(1);

 

代碼:

com.fry.database.MySQLiteOpenHelper

 1 package com.fry.database;
 2 
 3 import android.content.Context;
 4 import android.database.sqlite.SQLiteDatabase;
 5 import android.database.sqlite.SQLiteDatabase.CursorFactory;
 6 import android.database.sqlite.SQLiteOpenHelper;
 7 import android.util.Log;
 8 
 9 public class MySQLiteOpenHelper extends SQLiteOpenHelper{
10 
11     /*
12      * 1、context 上下文
13      * 2、那麼資料庫名稱
14      * 3、factory
15      * 4、version 資料庫文件的版本
16      */
17 
18     public MySQLiteOpenHelper(Context context,int version) {
19         super(context, "fanfan3.db", null, version);
20         // TODO Auto-generated constructor stub
21     }
22 
23     /* 資料庫文件創建成功後調用
24      * (non-Javadoc)
25      * @see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase)
26      */
27     @Override
28     public void onCreate(SQLiteDatabase db) {
29         Log.d("fanfan", "onCreate");
30         db.execSQL("CREATE TABLE student(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,age INTEGER)");
31     }
32 
33     /* 資料庫文件更新後調用 
34      * (non-Javadoc)
35      * @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int)
36      */
37     @Override
38     public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
39         Log.d("fanfan", "onUpgrade");
40     }
41 
42 }
資料庫類

com.fanfan.test.Test

  1 package com.fanfan.test;
  2 
  3 import com.fry.database.MySQLiteOpenHelper;
  4 
  5 import android.annotation.SuppressLint;
  6 import android.content.ContentValues;
  7 import android.database.Cursor;
  8 import android.database.sqlite.SQLiteDatabase;
  9 import android.test.AndroidTestCase;
 10 import android.util.Log;
 11 
 12 public class Test extends AndroidTestCase {
 13     public void test1() {
 14         MySQLiteOpenHelper helper = new MySQLiteOpenHelper(getContext(), 1);
 15         SQLiteDatabase database = helper.getReadableDatabase();
 16         helper.getWritableDatabase();
 17     }
 18 
 19     // 系統提供的API可以解決簡單問題,但是比如多表查詢的問題,系統搞不定,我們可以自己用execSQL寫sql語句
 20     public void insert() {
 21         MySQLiteOpenHelper helper = new MySQLiteOpenHelper(getContext(), 1);
 22         SQLiteDatabase database = helper.getReadableDatabase();
 23         // ContentValues values=new ContentValues();
 24         // values.put("name", "飯飯");
 25         // values.put("age", 20);
 26         // long row=database.insert("student", null, values);
 27         // Log.d("insert", "剛剛插入的是行的編號為:  "+row);
 28         // if(row==-1){
 29         // String s="插入失敗";
 30         // Log.d("insert", s);
 31         // }
 32         // 不用系統API,自己寫sql
 33         database.execSQL("insert into student (name,age) values ('小李',45)");
 34         // 關閉資料庫連接
 35         database.close();
 36     }
 37 
 38     public void delete() {
 39         MySQLiteOpenHelper helper = new MySQLiteOpenHelper(getContext(), 1);
 40         SQLiteDatabase database = helper.getReadableDatabase();
 41         // 返回受影響的行數
 42         int n = database.delete("student", "name=? and age=?", new String[] {
 43                 "飯飯", "20" });
 44         Log.d("delete", "返回受影響的行數為:  " + n);
 45         // 關閉資料庫連接
 46         database.close();
 47     }
 48 
 49     public void update() {
 50         MySQLiteOpenHelper helper = new MySQLiteOpenHelper(getContext(), 1);
 51         SQLiteDatabase database = helper.getReadableDatabase();
 52         ContentValues values = new ContentValues();
 53         values.put("name", "小紅");
 54         // 返回受影響的行數
 55 
 56         // 更改符合篩選條件的記錄
 57         int n = database.update("student", values, "name=?",
 58                 new String[] { "飯飯" });
 59         // 更改表中所有記錄
 60         // int n=database.update("student", values, null, null);
 61         Log.d("update", "返回受影響的行數為:  " + n);
 62         // 關閉資料庫連接
 63         database.close();
 64     }
 65 
 66     public void select() {
 67         MySQLiteOpenHelper helper = new MySQLiteOpenHelper(getContext(), 1);
 68         // 創建資料庫連接
 69         SQLiteDatabase database = helper.getReadableDatabase();
 70         /*
 71          * distinct==true 剔除重覆數據 table 表名 column 查詢的列 selection 篩選條件
 72          * selsetionArgs 指定篩選條件參數值 groupBy 分組 having 分組篩選 orderBy 排序 比如"age asc"
 73          * limit 分頁
 74          */
 75         // select * from student where
 76         // 返回的是一個結果集合
 77         // Cursor cursor=database.query(true, "student", new
 78         // String[]{"id","name","age"}, null, null, null, null, null, null);
 79 
 80         // 如果多表查詢,上面的方法不行,因為database.execSQL沒有返回值,我們無法返回結果
 81         Cursor cursor = database.rawQuery(
 82                 "select id,name,age from student where name=?",
 83                 new String[] { "小李" });
 84 
 85         // 下一行是否有數據
 86         while (cursor.moveToNext()) {
 87             // 具體得那一列的索引
 88             // 通過索引得到
 89             int id = cursor.getInt(cursor.getColumnIndex("id"));// id是第0列
 90             // 直接通過列號得到
 91             String name = cursor.getString(1);
 92             int age = cursor.getInt(2);
 93             String ans = "id:  " + id + "      name:  " + name + "     age:  "
 94                     + age;
 95             Log.d("select", ans);
 96         }
 97         // 關閉資料庫連接
 98         database.close();
 99     }
100 }
JUnit 測試增刪改查

 


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

-Advertisement-
Play Games
更多相關文章
  • UX設計師是以用戶體驗為中心,進行產品設計,他們的任務就是讓用戶說出“Yes”。UX設計涉及到人機交互的各個方面,如可用性、功能性、交互設計、信息架構設計等等。就這些方面來說,原型工具不可或缺。市場上的原型工具有很多,但想找到合心意的卻比較困難。其實,挑選工具也是有門道的,在確定具體用戶及項目需求前 ...
  • iOS精選源碼 iOS優質博客 前言發現好久沒有研究、學習iOS優秀開源代碼,現在大部分時間都在寫業務代碼, 學習其他語言及一些雜七雜八的事情。所以現在就從簡短的開源代碼開始學習。這一篇就寫FaceBook, 這個極度熱愛開源的公司, 它的一套關於KVO的開源代碼。GitHub代碼演示代碼地址正文F ...
  • 一、前沿||潛心修心,學無止盡。生活如此,coding亦然。本人鳥窩,一隻正在求職的鳥。聯繫我可以直接微信:jkxx123321 二、項目總結 **||**文章參考資料:1. http://blog.csdn.net/u011272795/article/details/73824558 2.htt ...
  • 參考資料:https://github.com/sunyardTime/React-Native-CodeStyle 感謝情書哥無私奉獻 ##一、編程規約 ###(一) 命名規約 【強制】 代碼中命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束; 【強制】 代碼中命名嚴禁使用拼音與英文 ...
  • ...
  • Notification的幾種基本使用方法,大家肯定都已經爛熟於心,我也不必多說.給一個鏈接:https://zhuanlan.zhihu.com/p/25841482 接下來我想說的是android5.0 後的彈出通知, 網上的方法是: 但上面的做法並不能在android5.0以下的設備上使通知彈 ...
  • 因為項目中需要用到頭像上傳的功能,所以就下個Ddmo先來實現下。 demo我是類似仿微信的,在一個GridView中展示所有的圖片,其中第一個item可以去照相;獲取到圖片後再進行剪切。 圖片的剪切是從網上找的感覺不錯就用,暫時也沒有測試。 獲取圖片可以用:https://github.com/lo ...
  • 效果 源碼 https://github.com/YouXianMing/Animations 說明 1. TwoLevelLinkageView封裝了兩個tableView,左邊tableView中的cell以及右邊tableView中的cell以及header都可以定製 2. TwoLevelL ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...