Android中數據存儲(三)——SQLite資料庫存儲數據

来源:http://www.cnblogs.com/univalsoft-mobile-team/archive/2017/10/08/7637322.html
-Advertisement-
Play Games

當一個應用程式在Android中安裝後,我們在使用應用的過程中會產生很多的數據,應用都有自己的數據,那麼我們應該如何存儲數據呢? 數據存儲方式 Android 的數據存儲有5種方式: 1. SharedPreferences存儲數據 SharedPreferences數據存儲,也叫作xml存儲。這是 ...


當一個應用程式在Android中安裝後,我們在使用應用的過程中會產生很多的數據,應用都有自己的數據,那麼我們應該如何存儲數據呢?

數據存儲方式

Android 的數據存儲有5種方式:

1. SharedPreferences存儲數據 
   SharedPreferences數據存儲,也叫作xml存儲。這是將數據存儲“data/data/程式包名/share_prefs”路徑下的到xml文件中。 
相關連接:《Android中數據存儲(一)——SharedPreferences存儲數據》 
2. 文件存儲數據 
   分為內部儲存和外部存儲。內部存儲是應用程式使用Android為自己分配的記憶體空間,數據存儲到“/data/data/程式包名/files”路徑下的相應文件中。外部存儲是使用手機sdcard的記憶體(這個sdcard並不是我們經常說的那個可以拆卸替換的SD卡,那個SD卡我們稱之為擴展卡),使用這部分記憶體要聲明相應的許可權。 
相關連接: 《Android中數據存儲(二)——文件存儲數據 》 
3. SQLite資料庫存儲數據 
  使用資料庫進行存儲,這個一般數據量比較大的時候。   
相關連接:《Android中數據存儲——SQLite資料庫存儲數據》 
4. 使用ContentProvider存儲數據 
  這個比較眼熟,ContentProvider也是Android的四大組件之一。ContentProvider一般是第三方提供的數據存儲方式,向我們手機中的通訊錄聯繫人,照片,音樂等…… 
相關連接:《Android中數據存儲——ContentProvider存儲數據 》   
5. 網路存儲數據 
   這個是將數據上傳到網路上進行存儲。

  下麵進入我們今天的主要內容,使用SQLite資料庫存儲數據。

SQLite資料庫存儲數據

  SQLite是一個輕量級關係型資料庫,既然是關係型資料庫,那操作起來其實跟mysql、sql server差不多的。 
  SQLite 和其他資料庫最大的不同就是對數據類型的支持,創建一個表時,可以在 CREATE TABLE 語句中指定某列的數據類型,但是你可以把任何數據類型放入任何列中。當某個值插入資料庫時,SQLite 將檢查它的類型。如果該類型與關聯的列不匹配,則 SQLite 會嘗試將該值轉換成該列的類型。如果不能轉換,則該值將作為其本身具有的類型存儲。比如可以把一個字元串(String)放入 INTEGER 列。SQLite 稱這為“弱類型”(manifest typing.)。 
  對資料庫SQLite進行操作,我們要藉助於SQLiteOpenHelper類進行操作。對資料庫的操作也就是”增、刪、改、查“。在學習資料庫的操作之前我們首先要學會如何創建資料庫……

創建資料庫

  資料庫的操作藉助於SQLiteOpenHelper,SQLiteOpenHelper是一個抽象類,我們我們在使用SQLiteOpenHelper時要先創建一個MySQLiteOpenHelper繼承SQLiteOpenHelper類。 
  SQLiteOpenHelper有兩個非常重要的方法:getReadableDatabase()方法返回資料庫是一個只讀的;getWriteableDatabase()方法獲得是一個可讀寫的資料庫對象。這裡我們使用getWriteableDatabase()方法獲得資料庫Database對象。 
   
創建一個MySQLiteOpenHelper繼承SQLiteOpenHelper類:

 1 public class MySQLiteOpenHelper extends SQLiteOpenHelper {
 2 
 3      //構造器,傳入四個參數Context對象,資料庫名字name,操作資料庫的Cursor對象,版本號version。 
 4     public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
 5         super(context, name, factory, version);
 6     }
 7     //自定義的構造器
 8     public MySQLiteOpenHelper(Context context, String name) {
 9         this(context, name, null, 1);//傳入Context和資料庫的名稱,調用上面那個構造器
10     }
11 
12     @Override
13     public void onCreate(SQLiteDatabase sqLiteDatabase) {
14         //在創建資料庫時,創建一個數據表table
15         String sql = "create table if not exists user(id integer primary key  autoincrement, name varchar(20), passwords varchar(20))";
16         sqLiteDatabase.execSQL(sql);
17 
18     }
19     @Override
20     public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
21     //用於升級資料庫,只需要在創建本類對象時傳入一個比之前創建傳入的version大的數即可。
22     }
23 }

 

創建資料庫:

1     //創建資料庫
2         MySQLiteOpenHelper mySQLiteOpenHelper = new MySQLiteOpenHelper(getApplicationContext(), "create_db");//資料庫名稱為create_db。
3         SQLiteDatabase db = mySQLiteOpenHelper.getWritableDatabase();

 

  使用SQLiteDatabase的insert(String table, String nullColumnHack, ContentValues values)方法插入數據。這個方法包含三個參數: 
  我們先列舉一條SQLite中的插入語句:INSERT INTO user (name, passwords)] VALUES ("張三", "123456"); 
String table:操作的數據表的名稱。 
String nullColumnHack:用於我們在未指定添加數據的情況下,為數據表中可以添加null值的數據填入null值。一般這個參數我們傳入null。 
ContentValues values:用於傳遞數據,通常我們通過ContentValues 類的對象的putXXX()方法封裝數據,然後將數據添加進資料庫。 
  ContentValues 類,類似於java中的Map,以鍵值對的方式保存數據。

1          ContentValues value = new ContentValues();
2         value.put("name", "張三");//向數據表中欄位名為name的欄位中添加"張三"。
3         value.put("passwords", "123456");//向數據表中欄位名為passwords的欄位中添加"123456"。
4         //db資料庫對象在前面已經創建,這裡直接使用。
5         db.insert("user",null, value);//在資料庫的user數據表中插入:欄位名name為"張三",欄位名passwords為"123456"的數據。

 

  使用SQLiteDatabase的delete(String table, String whereClause, String[] whereArgs)方法刪除數據。這個方法包含三個參數: 
  我們先列舉一條SQLite中的刪除語句:DELETE FROM user WHERE name="張三"。 
String table:操作的數據表的名稱。 
String whereClause:約束刪除行的條件。相當於SQLite語句中“where name=?“內容。 
String[] whereArgs:與前一個參數對應約束刪除行的條件。相當於”where name=”張三““中的”張三“。 
註意:如果參數String whereClause和參數String[] whereArgs都傳null的話,就是刪除所有行。

    //db資料庫對象在前面已經創建,這裡直接使用。
    db.delete("user", "name=?", new String[]{"張三"});

 

  使用SQLiteDatabase的 update (String table, ContentValues values, String whereClause, String[] whereArgs)方法刪除數據。這個方法包含四個參數: 
  我們先列舉一條SQLite中的修改語句:UPDATE user SET name= "李四", passwords= "123" WHERE name="張三"。 
String table:操作的數據表的名稱。 
ContentValues values:用於傳遞數據,通常我們通過ContentValues 類的對象的putXXX()方法封裝數據,然後將數據添加進資料庫。 
String whereClause:約束修改行的條件。相當於SQLite語句中“where name=?“內容。 
String[] whereArgs:與前一個參數對應約束刪除行的條件。相當於”where name=”張三““中的”張三“。

1         //db資料庫對象在前面已經創建,這裡直接使用。
2         ContentValues values = new ContentValues();
3         values.put("passwords", "abcd");
4         db.update("user", values, "name=?", new String[]{"張三"});

 

  對於”查“操作,SQLiteDatabase提供了多種方法。 
  我們先列舉一條SQLite中的修改語句:SELECT passwords="123" FROM user。 
(1)使用SQL語句進行查詢。這裡SQLiteDatabase提供了方法:

  • rawQuery (String sql, String[] selectionArgs):該方法返回 Cursor類的對象,用於操作查詢的結果。
1         String sql = "select * from user";
2         Cursor cursor = db.rawQuery(sql, null);
3         cursor.moveToFirst();//轉移到結果的第一行
4         while(!cursor.isAfterLast()){
5             String name=cursor.getString(cursor.getColumnIndex("name"));
6             String passwords=cursor.getString(cursor.getColumnIndex("passwords"));
7             Log.d("data", "name=" + name + "   password=" + passwords);
8             cursor.moveToNext();
9         }

 

(2)使用SQLiteDatabase內定方法查詢:

  • query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit):這個方法有N多個參數啊……String table是操作的數據表的名稱;String selection是篩選的欄位選項;String[] selectionArgs是欄位選項對應的值;String groupBy是篩選結果的分組依據;String having是在由groupBy子句創建的分組上設置條件;String orderBy是結果的排序方式,String limit是篩選結果的顯示限制,例如“2, 3”是指從篩選結果的第2個開始顯示3個。
1         Cursor cursor=db.query("user", null, null, null, null,null, " id desc", "2,3");//limit語句  offset, num
2         cursor.moveToFirst();//轉移到結果的第一行
3         while(!cursor.isAfterLast()){
4             String name=cursor.getString(cursor.getColumnIndex("name"));
5             String passwords=cursor.getString(cursor.getColumnIndex("passwords"));
6             Log.d("data", "   name=" + name + "   password=" + passwords);
7             cursor.moveToNext();
8         }

 

  這樣資料庫的操作和存儲就差不多了哦,對於資料庫的操作也就無非是這四種……


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

-Advertisement-
Play Games
更多相關文章
  • 寫在前面 最近在做移動端方面運用到了餓了麽的 前端組件庫,因為不想單純用組件而使用它,故想深入瞭解一下實現原理。後續將會繼續研究一下其他的組件實現原理,有興趣的可以關註下。 代碼在這裡: "戳我" 1. 說明 父容器 ,子頁面 2. 核心解析 2.1 頁面初始化 由於所有頁面都在手機屏幕左側一個屏幕 ...
  • 數組去重的方式有很多,讓我們從最原始的方式一步步進化到一行代碼搞定 ...
  • 原文:https://segmentfault.com/a/1190000002634958 內置對象與原生對象 內置(Build-in)對象與原生(Naitve)對象的區別在於:前者總是在引擎初始化階段就被創建好的對象,是後者的一個子集;而後者包括了一些在運行過程中動態創建的對象。 原生對象(Ne ...
  • 公司比較傳統,一直使用的JSP做項目,沒有遇到過跨域問題。 最近因為公司接到一個微信spa項目,因為考慮到項目需要調用老介面,斗膽選擇nginx(1.12.1)做介面轉發服務, 開發環境使用的win10,開啟多核,gzip都沒有出現問題 但是搬到生產環境上就出問題了, 因為公司伺服器A環境是wind ...
  • Document 獲取驗證碼 ...
  • -(UIImage*)getScreenPhoto{ CGFloat scale = [UIScreen mainScreen].scale; NSMutableArray *images = [NSMutableArray array]; CGSize contentSize = self.vie ...
  • 1.安裝jdk8 並配置環境變數 2.安裝android sdk並配置環境變數 使用了adt-bundle-windows-x86_64-20140702集成包 3.安裝gradle-4.2 4.安裝node.js 5.安裝cordova 網上找了cnpm的方式 但是一直報錯終端輸入確認:cordo ...
  • 該源碼是停車場管理軟體附帶源代碼 J2EE服務端+android客戶端,也是一套停車場管理車輛進出的管理軟,喜歡的朋友可以看看吧。應用的後臺管理主要功能介紹:1 機構管理 ,機構有從屬管理<ignore_js_op> 2 車場管理 ,車場隸屬於某個機構<ignore_js_op> 3 後臺用戶管理, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...