Android開發之內訪Sqlite數據庫(六)

文章目錄

  • 1. Android開發之外訪Sqlite數據庫
    • 1.1 Sqlite數據庫的優點
    • 1.2 Sqlite接口簡介
      • 接口中的抽象方法
      • 接口中的實例方法
      • 接口的構造方法
      • 示例
        • 步驟
        • 例子 —— 實現增刪改查

1. Android開發之外訪Sqlite數據庫

SQLite是一個軟件庫,實現了自給自足的、無服務器的、零配置的、事務性的 SQL 數據庫引擎。SQLite是一個增長最快的數據庫引擎,這是在普及方面的增長,與它的尺寸大小無關。SQLite 源代碼不受版權限制。

SQLite是一個進程內的庫,實現了自給自足的、無服務器的、零配置的、事務性的 SQL 數據庫引擎。它是一個零配置的數據庫,這意味著與其他數據庫不一樣,您不需要在系統中配置。

就像其他數據庫,SQLite 引擎不是一個獨立的進程,可以按應用程序需求進行靜態或動態連接。SQLite 直接訪問其存儲文件。

1.1 Sqlite數據庫的優點

  • 不需要一個單獨的服務器進程或操作的系統(無服務器的)。
  • SQLite 不需要配置,這意味著不需要安裝或管理。
  • 一個完整的 SQLite 數據庫是存儲在一個單一的跨平臺的磁盤文件。
  • SQLite 是非常小的,是輕量級的,完全配置時小于 400KiB,省略可選功能配置時小于250KiB。
  • SQLite 是自給自足的,這意味著不需要任何外部的依賴。
  • SQLite 事務是完全兼容 ACID 的,允許從多個進程或線程安全訪問。
  • SQLite 支持 SQL92(SQL2)標準的大多數查詢語言的功能。
  • SQLite 使用 ANSI-C 編寫的,并提供了簡單和易于使用的 API。
  • SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中運行。

1.2 Sqlite接口簡介

接口中的抽象方法

  • 首先你要知道SQLiteOpenHelper 是一個抽象類,這意味著如果我們想要使用它的話,就需要創建一個 自己的幫助類去繼承它。SQLiteOpenHelper 中有兩個抽象方法,分別是onCreate()onUpgrade();兩個方法需要實現創建、升級數據庫的邏輯。

接口中的實例方法

  • sQLiteOpenHelper中還有兩個非常重要的實例方法: **getReadableDatabase()**和 getWritableDatabase()。這兩個方法都可以創建或打開一個現有的數據庫(如果數據庫已存在則直接打開,否則創建一個新的數據庫),并返回一個可對數據庫進行讀寫操作的對象。

    不同的是當數據庫不可寫人的時候(如磁盤空間已滿), **getReadableDatabase()方法返回的對象將以只讀的方式打開數據庫,而getWritableDatabase()**方法則將出現異常。

接口的構造方法

  • SQLiteOpenHelper中有兩個構造方法可供重寫,一般使用參數少一點的那個構造方法即可。這個構造方法中接收4個參數,第一個參數是Context,就是上下文環境,必須要有它才能對數據庫進行操作。第二個參數是數據庫名,創建數據庫時使用的就是這里指定的名稱。第三個參數允許我們在查詢數據的時候返回一個自定義的Cursor,一般都是傳人null。第四個參數表示當前數據庫的版本號,可用于對數據庫進行升級操作。構建出SQLiteOpenHelper 的實例之后,再調用它的**getReadableDatabase()getWritableDatabase()方 法就能夠創建數據庫了此時,重寫的onCreate()**方法也會得到執行,所以通常會在這里去處理一些創建表的邏輯。

示例

步驟
  1. 實現SQLiteOpenHelper接口,重寫其中的onCreate()onUpgrade()方法
    • 定義建表語句
    • onCreate()方法中使用參數調用execSQL()方法傳入建表語句;【可以使用一個Toast顯示創建成功】
  2. 在java文件中定義觸發方式觸發邏輯
    • 使主類繼承點擊接口;定義控件,獲取控件,定義事件監聽器
      • 別忘了在onCreate()方法中找到控件
      • 使用SQLiteDatabase定義數據庫操作對象
      • 使用ContentValues定義數據組裝以便后續傳入數據庫
      • 對象調用ContentValuesput()方法組裝數據
      • 對象調用SQLiteDatabase定義的insert()update()delete()方法操作數據庫
例子 —— 實現增刪改查

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><android.widget.Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/create_database"android:text="Create database"/><android.widget.Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/add_data"android:text="Add data"/><android.widget.Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/update_data"android:text="Update data"/><android.widget.Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/delete_data"android:text="Delete data"/></LinearLayout>

MySqliteOpenHelper.java

package com.example.sql;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;import androidx.annotation.Nullable;public class MySqliteOpenHelper extends SQLiteOpenHelper {public static final String CREATE_BOOK = "create table Book ("+ "_id integer primary key autoincrement,"+ "author text,"+ "price real,"+ "pages integer,"+ "name text)";private Context mContext;public MySqliteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);mContext = context;}// 數據庫創建時調用@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK);Toast.makeText(mContext, "create succeed", Toast.LENGTH_SHORT).show();}// 數據庫升級時使用@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}

MainActivity.java

package com.example.sql;import androidx.appcompat.app.AppCompatActivity;import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private MySqliteOpenHelper dbHelper;private Button createDatabase;private Button addData;private Button updateData;private Button deleteData;private Button queryData;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);dbHelper = new MySqliteOpenHelper(this,"BookStore.db",null,2);createDatabase = findViewById(R.id.create_database);addData = findViewById(R.id.add_data);updateData = findViewById(R.id.update_data);deleteData = findViewById(R.id.delete_data);queryData = findViewById(R.id.query_data);createDatabase.setOnClickListener(this);addData.setOnClickListener(this);updateData.setOnClickListener(this);deleteData.setOnClickListener(this);queryData.setOnClickListener(this);}@Overridepublic void onClick(View v) {if(v.getId() == R.id.create_database){dbHelper.getWritableDatabase();}else if(v.getId() == R.id.add_data){SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();// 開始組裝第一條數據values.put("name","The Da Vinci Code");values.put("author","Dan Brown");values.put("pages","454");values.put("price","16.96");db.insert("Book",null,values); // 插入第一條數據values.clear();// 開始組裝第二條數據values.put("name","The Lost Symbol");values.put("author","Dan Brown");values.put("pages","510");values.put("price","19.95");db.insert("Book",null,values); // 插入第一條數據Toast.makeText(this, "add succeed", Toast.LENGTH_SHORT).show();}else if(v.getId() == R.id.update_data){SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("price",10.99);db.update("Book",values,"name = ?",new String[]{"The Da Vinci Code"});Toast.makeText(this, "update succeed", Toast.LENGTH_SHORT).show();}else if(v.getId() == R.id.delete_data){SQLiteDatabase db = dbHelper.getWritableDatabase();db.delete("Book","pages > ?",new String[]{ "500" });Toast.makeText(this, "delete succeed", Toast.LENGTH_SHORT).show();}else if(v.getId() == R.id.query_data){SQLiteDatabase db = dbHelper.getWritableDatabase();// 查詢Book表中所有的數據Cursor cursor = db.query("Book",null,null,null,null,null,null);if(cursor.moveToFirst()){do{// 遍歷Cursor對象,取出數據并打印String name = cursor.getString(0);String author = cursor.getString(0);int pages = cursor.getInt(0);double price = cursor.getDouble(0);Log.d("MainActivity","book name is " + name);Log.d("MainActivity","book author is " + author);Log.d("MainActivity","book pages is " + pages);Log.d("MainActivity","book price is " + price);}while(cursor.moveToNext());}Toast.makeText(this, "yes", Toast.LENGTH_SHORT).show();cursor.close();}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23379.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23379.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python的優勢有哪些?

python的優點很多&#xff0c;下面簡單地列舉一些&#xff1a; 簡單 Python的語法非常優雅&#xff0c;甚至沒有像其他語言的大括號&#xff0c;分號等特殊符號&#xff0c;代表了一種極簡主義的設計思想。閱讀Python程序像是在讀英語。 易學 Python入手非常快&#xff0c;學習…

K8s:無狀態

無狀態服務 無狀態服務是指服務的實例之間沒有持久化狀態&#xff0c;每個實例都是相同的&#xff0c;可以互換使用。 調度器 ReplicationController 簡稱 RC是 Kubernetes 早期版本中用來確保 Pod 副本始終運行的 API 對象。它通過監控 Pod 副本的數量&#xff0c;確保任何…

vue 常用的 UI 框架及表格

vue 3 常用的 UI 框架及表格 常用 UI 框架 Element PlusAnt Design VueiViewVxe UIVuetifyBootstrap VueMuse UI 專業表格 SpreadJSAG GridVxe Table

Linux——內存管理代碼分析

虛空間管理 頁框和頁的關系 頁框 將內存空間分為一個個大小相等的分區(比如:每個分區4KB),每個分區就是一個頁框&#xff0c;也叫頁幀&#xff0c;即物理頁面&#xff0c;是linux劃分內存空間的結果。 每個頁框都有一個頁框號&#xff0c;即內存塊號、物理塊號。 頁 將用戶…

深度學習之指數移動平均模型(EMA)介紹

指數移動平均模型&#xff08;Exponential Moving Average Model&#xff0c;EMA&#xff09;是一種用于平滑時間序列數據的技術。它通過對數據進行加權平均來減少噪音和波動&#xff0c;從而提取出數據的趨勢。 在深度學習中&#xff0c;EMA 常常用于模型的參數更新和優化過程…

完整指南:遠程管理 Linux 服務器的 Xshell6 和 Xftp6 使用方法(Xshell無法啟動:要繼續使用此程序........,的解決方法)

&#x1f600;前言 在當今軟件開發領域&#xff0c;遠程管理 Linux 服務器已成為日常工作的重要組成部分。隨著團隊成員分布在不同的地理位置&#xff0c;遠程登錄工具的使用變得至關重要&#xff0c;它們為開發人員提供了訪問和管理服務器的便捷方式。本文將介紹兩款功能強大的…

python隨機顯示四級詞匯 修改版直接顯示釋義

python隨機顯示四級詞匯 修改版直接顯示釋義 添加暫停 和繼續(按下中建滾輪觸發) 按下右鍵 退出程序 解決在暫停后 ,重新調用update_word 會明顯發現每隔5秒更新一次單詞的速率已經改變 速率改變的問題可能是由于暫停期間沒有清除之前的定時器所導致的。為了確保重新調用updat…

Linux高級進階-ssh配置

Ubuntu-system 允許使用root遠程登陸 apt install ssh -y在/etc/ssh/sshd_config 文件修改PermitRootLogin yes systemctl restart ssh遠程連接軟件用戶名為root

Ubuntu系統中Apache Web服務器的配置與實戰

?? 歡迎大家來訪Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭?&#xff5e;?? &#x1f31f;&#x1f31f; 歡迎各位親愛的讀者&#xff0c;感謝你們抽出寶貴的時間來閱讀我的文章。 我是Srlua小謝&#xff0c;在這里我會分享我的知識和經驗。&am…

Educational Codeforces Round 166(Div.2) A~D

A.Verify Password&#xff08;字符串&#xff09; 題意&#xff1a; Monocarp正在開發他的新網站&#xff0c;目前面臨的挑戰是如何讓用戶選擇強密碼。 Monocarp認為&#xff0c;強密碼應滿足以下條件&#xff1a; 密碼只能由小寫拉丁字母和數字組成&#xff1b;字母后面不…

PasteCode系列系統說明

定義 PasteCode系列是指項目是基于PasteTemplate構建的五層以上項目&#xff0c;包括不僅限于 Domain EntityFrameworkCore Application.Contracts Application HttpApi.Host 熟悉ABP vNext就很好理解了&#xff0c;因為PasteTemplate就是基于ABP的框架精簡而來&#xff01;在…

一些Mysql面試題

InnoDB是如何存儲數據的&#xff1f; InnoDB 的數據是按「數據頁」為單位來讀寫的&#xff0c;默認數據頁大小為 16 KB。每個數據頁之間通過雙向鏈表的形式組織起來&#xff0c;物理上不連續&#xff0c;但是邏輯上連續。 數據頁內包含用戶記錄&#xff0c;每個記錄之間用單向…

【java 如何將字符串反轉?】

文章目錄 概要示例&#xff08;1&#xff09;使用StringBuilder的reverse方法&#xff08;2&#xff09;使用charAt和循環&#xff08;3&#xff09;使用雙指針&#xff08;4&#xff09;使用遞歸 總結 概要 在Java中&#xff0c;有多種方法可以將字符串反轉&#xff0c;我這里…

代碼隨想錄訓練營第二天 977有序數組的平方 209長度最小的子數組 59螺旋矩陣II

第一題&#xff1a; 題目鏈接&#xff1a;977. 有序數組的平方 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 先將數組求完平方和后進行排序&#xff0c;很簡單&#xff0c;主要是排序算法的考察。 這里采用快排 快排的思路&#xff1a; 取這個數組的中間值…

代碼隨想錄算法訓練營第四十六 | ● 139.單詞拆分 ● 關于多重背包,你該了解這些! ● 背包問題總結篇!

139.單詞拆分 視頻講解&#xff1a;https://www.bilibili.com/video/BV1pd4y147Rh https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<st…

java stream流之groupby的用法

簡單分組 按照年齡對 Person 對象進行分組&#xff1a; 代碼示例 import java.util.*; import java.util.stream.Collectors;public class SimpleGrouping {public static void main(String[] args) {List<Person> people Arrays.asList(new Person("Alice"…

上市即交付,比亞迪秦L DM-i萬人交車暨千媒眾測開營

6月6日&#xff0c;“引領中級 開創油耗2時代”秦L DM-i萬人交車暨千媒眾測開營儀式在比亞迪大本營深圳盛大舉行。 眾多車主代表親臨現場&#xff0c;與全國各地的比亞迪4S店千店聯動&#xff0c;將秦L DM-i全國交付推向新的高潮。發布即量產&#xff0c;上市即交付&#xff0…

ESP32:FreeRTOS節拍配置(vTaskDelay延時10ms改為1ms)

文章目錄 背景方法手動修改sdkconfig通過idf.py menuconfig 背景 在FreeRTOS的默認配置中&#xff0c;任務調度的頻率默認是100HZ&#xff0c;因此默認vTaskDelay默認延時是10ms。 FreeRTOS 的系統時鐘節拍可以在配置文件 FreeRTOSConfig.h 里面設置&#xff1a;#define confi…

【HarmonyOS】鴻蒙應用子模塊module資源如何獲取

【HarmonyOS】鴻蒙應用子模塊module資源如何獲取 一、問題背景&#xff1a; 在多模塊項目工程中&#xff0c;單個模塊的資源不會放在主模塊中&#xff0c;所以我們需要在子模塊中訪問自己的資源。如果使用默認的資源獲取api&#xff0c;會提示找不到資源。 那如何獲取子模塊下…

【AI基礎】第四步:保姆喂飯級-langchain+chatglm2-6b+m3e-base

在第三步手動安裝chatglm2-6b時&#xff0c;已經可以通過web進行交互。langchain重新封裝了一下AI框架&#xff0c;提供更加友好的開發功能&#xff0c;類似于AI屆的spring框架。langchain的安裝過程也類似于上一步說的&#xff1a;【AI基礎】第三步&#xff1a;純天然手動安裝…