Android-三種持久化方式詳解

  1. 持久化技術分為3種,文件,sharedPreferences存儲,數據庫來存儲;

目錄

文件存儲:

利用SharedPreferences中讀取數據

SQLite創建數據庫

更新

添加

刪除

查找:


文件存儲:

文件存儲是 Android 中最基礎的持久化方式,適合保存結構簡單、體積小的文本或二進制數據,如日志、配置、緩存等,使用方便且無需數據庫支持;但它不適合處理結構復雜或需要頻繁查詢的數據,缺乏并發處理能力與查詢效率,且操作繁瑣,維護成本高。適用于對數據結構要求不高的場景;

把數據存入到文件中:

通過openFileOutput()參數有兩個,第一個是省略包名的文件名,不寫路徑,第二個參數是存儲的方式,是追加還是新存,MODE_PRIVATE代表追加,MODE_END代表新存,返回的是一個fileoutput對象;

   FileOutputStream out = null;BufferedWriter writer = null;try {out = openFileOutput(FILE_NAME, MODE_PRIVATE);writer = new BufferedWriter(new OutputStreamWriter(out));writer.write(inputText);} catch (IOException e) {e.printStackTrace();} finally {try {if (writer != null) writer.close();} catch (IOException e) {e.printStackTrace();}}

在活動銷毀之前調用這個方法

把數據從文件取出:

openfileinput()只有一個參數就是文件名;思路構建inputstreamreader對象,構建buffedreader對象,最后利用readline讀入;

代碼如下:

 try {in = openFileInput(FILE_NAME);reader = new BufferedReader(new InputStreamReader(in));String line;while ((line = reader.readLine()) != null) {content.append(line).append("\n");}} catch (IOException e) {e.printStackTrace();} finally {try {if (reader != null) reader.close();} catch (IOException e) {e.printStackTrace();}}

根據例子新學到的知識:

editview的方法: settext方法可以把數據放到編輯框里;

setSelection(長度),定光標

TextUtils.isempty(字符串)判空

利用ShatedPreferenecs存儲

?以上的實例總結是我個人的學習總結,各位可用于知識點的復習,如果不需要可跳過;

利用SharedPreferences中讀取數據

SharedPreferences 是 Android 中專門用于 保存少量鍵值對數據的持久化方式,適合保存用戶的配置信息、登錄狀態、設置項等;它本質上使用 XML 文件 存儲數據,操作簡單、高效、安全;

存入

有三種獲得sharedpreferences的方法:

利用Context類中的方法:getSharedPreferences()方法;參數是文件名+類型只有(MODE——PRIVATE方法)

利用Activity類中的方法:getPrefereences()方法 參數只有類型,會把類名作為文件名

利用PreferenceManager類中的getDefaultSgatedPreferences()方法 參數只有context;

獲取到sharedpreferences對象之后的做法

  1. New一個editor對象

  2. put數據

  3. apply()開啟

代碼示例如下:

SharedPreferences.Editor edit = getSharedPreferences("name",MODE_PRIVATE).edit();
edit.putInt("int",8);
edit.putBoolean("boolean",true);
edit.apply();

讀取

  1. getshatedpreferences方法得到對象

  2. 通過get數據獲取,參數有二,第一是鍵,第二是找不到以什么返回;

SharedPreferences preferences = getSharedPreferences("name",MODE_PRIVATE);
int q = preferences.getInt("int",0);
Log.d("ints","int is");

案例

學到這里,有一個關于密碼記憶的案例:在登錄界面,有一個選項,會將你這次登錄成功的密碼進行保存;那么我們一起來看看這個案例吧;

?在點擊之后的邏輯是如果你點了,進行保存,如果沒點,就調用clear方法

public void onClick(View view) {String s1 = a.getText().toString();String s2 = b.getText().toString();if(s1.equals("797923")&&s2.equals("2983")){edit  = pre.edit();if(f.isChecked()){edit.putString("zh",s2);edit.putString("mima",s1);edit.putBoolean("jy",true);}else{edit.clear();}edit.apply();Intent intent = new Intent(LoginActivity.this,MainActivity.class);startActivity(intent);finish();}
}

如果是初次登錄,記得獲取boolean的值的時候,第二個參數為false,必須要通過這個值我才能知道你當時有無選擇復選框;,然后如果為true,那么就進行獲取值,然后settext,也設置復選框:

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_login);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});pre = getSharedPreferences("wj",MODE_PRIVATE);button =(Button) findViewById(R.id.psss);a = (EditText) findViewById(R.id.password);b = (EditText) findViewById(R.id.accout);f= (CheckBox) findViewById(R.id.ck);boolean iff = pre.getBoolean("jy", false);if(iff){String c = pre.getString("zh","q");String d = pre.getString("mima","q");a.setText(d);b.setText(c);f.setChecked(true);}button.setOnClickListener(this);
}

SQLite創建數據庫

SQLite 是 Android 中內置的數據庫系統,適合存儲中等規模、結構化的本地數據,支持標準 SQL 操作。

getWritableDatabase和getReadableDatabase方法有什么不同

getWritableDatabase和getReadableDatabase方法有什么不同: 前者,可度可寫也可以查刪,但是如果磁盤滿了,寫入會崩潰;后者:未滿會返回可寫數據庫,但你不能寫,寫了可能崩潰,滿了返回安全的可度數據庫

一個類SQLiteOpenHelper是一個抽象類,想要創建數據庫需要自定義一個類去繼承,然后重寫方法,創建表,把表的創建放進OnCreat里面,這樣new對象的時候創建好數據庫的時候,也可以創建好表:對象.execSQL(表名)

建表語句

好嘛,這里先介紹一下建表語句:

    public static final String CREATE_BOOK = "create table Book (" +"id integer primary key autoincrement,"+"author text,"+"price real," +"pages Integer," +"name text)";

CREATE_BOOK:表的語句名;

create table Book (:第一行這里:Book代表表名;

后面的行:第一個代表列名,第二個代表類型,這里給出類型

text? ?文本? ? ?real? 浮點數? ?Integer? 整數? blob 二進制

接下來看看怎么創建數據庫把:

自定以類

建表,構造,重寫方法;

public class MyDatabaseHelper extends SQLiteOpenHelper {private Context mycontext;public static final String CREATE_BOOK = "create table Book (" +"id integer primary key autoincrement,"+"author text,"+"price real," +"pages Integer," +"name text)";public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);mycontext = context;}@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {sqLiteDatabase.execSQL(CREATE_BOOK);Toast.makeText(mycontext,"create yse",Toast.LENGTH_LONG).show();}@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}

創建對象,調用getweitabledatabase方法可以創建數據庫;

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});MyDatabaseHelper mdh = new MyDatabaseHelper(this,"book.db",null,1);@SuppressLint({"MissingInflatedId", "LocalSuppress"}) Button a = (Button)findViewById(R.id.DT);a.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mdh.getWritableDatabase();}});}
}

更新

如果你要更新,比如你要添加表,但是Oncreate只會在創建庫的時候啟動一次,這個時候刪除程序不理智,在upgrade方法中,刪除已經存在的表格(否則會報錯).exec("drop table if exits 表名"),然后調用creat方法,最后在創建數據庫對象時,改版本號;

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {sqLiteDatabase.execSQL("drop table if exists BOOK");onCreate(sqLiteDatabase);
}

添加

得到SQiteDatabase對象之后,有一個添加方法:insert方法

三個參數,第一個表名,第二個Null不添加數據的情況下的一列可以為Null 為null,第三個參數傳入的值

這里是一個對象ContentValues對象,這個對象的方法put(第一個參數是項,第二個參數是數據);

SQLiteDatabase aqd = mdh.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name","zh");
values.put("author","1");
values.put("pages",677);
values.put("price",90.8);
aqd.insert("BOOK",null,values);

刪除

delete() 用于按條件刪除表中數據,相信你立馬就可以理解,這個代碼是刪除大于700頁的行了

SQLiteDatabase aqd = mdh.getWritableDatabase();
aqd.delete("BOOK","pages > ?" ,new String[]{"700"});

查找:

通過query方法得到cursor方法,

通過getstring,

外層為行,內層確定列

我們可以看到有多個參數,很是難記,但我們一般就第一個參數寫表名,后面參數全是null了

最近記得關閉

Cursor cr = mdh.getWritableDatabase().query("BOOK",null,null,null,null,null,null);
if(cr.moveToFirst()){do{Log.e("MainActivity","book page is");String names = cr.getString(cr.getColumnIndexOrThrow("name"));String author = cr.getString(cr.getColumnIndexOrThrow("author"));double jg = cr.getDouble(cr.getColumnIndexOrThrow("price"));int page = cr.getInt(cr.getColumnIndexOrThrow("pagesr"));Log.e("MainActivity","book name is"+names);Log.e("MainActivity","book page is"+page);}while(cr.moveToNext());
}
cr.close();

但我們是學習嘛,還是把其他參數也看看吧!

Cursor cursor = db.query("Book",                // 表名null,                  // 要查詢的列(null 表示全部)"author = ?",          // 查詢條件new String[]{"曹雪芹"}, // 條件參數null, null, null       // 分組、排序等
);

好啦,本次分享到此結束!

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

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

相關文章

并發安全之鎖機制一

鎖機制一 鎖機制是計算機系統中解決并發沖突的核心工具,其存在和應用場景源于一個根本問題:當多個執行單元(線程、進程、分布式節點)同時訪問或修改同一份共享資源時,如何保證數據的正確性、一致性和系統可靠性&#x…

結合項目闡述 設計模式:單例、工廠、觀察者、代理

原文鏈接:https://download.csdn.net/blog/column/12433305/133862792#_1613 1、工廠模式應用 C17及之后可編譯 /*日志落地模塊的實現1.抽象落地基類2.派生子類(根據不同落地方向進行派生)3.使用工廠模式進行創建與表示的分離 */#ifndef _…

uniapp 更新apk有緩存點不動,卸載安裝apk沒有問題。android

方式一。pages.json:"globalStyle" : {"navigationBarTextStyle" : "black","navigationBarTitleText" : "uni-app","navigationBarBackgroundColor" : "#F8F8F8","backgroundColor&qu…

HTML響應式SEO公司網站源碼

核心優勢 100%純HTML/CSS開發自動適配手機/平板/PC內置SEO優化結構0.5秒極速加載 包含頁面 ? 首頁(關鍵詞布局優化版) ? 服務項目展示頁 ? 客戶案例庫 ? 新聞資訊系統 ? 聯系方式(帶地圖API) 技術參數 兼容Chrome/Firefo…

Error: llama runner process has terminated: exit status 2

我是i7 12700h ,3080顯卡,在 Windows 11 上運行 ollama run deepseek-r1:1.5b 出現 Error: llama runner process has terminated: exit status 2 之前是好用的,后來不知為什么就不好用了。 原因: 檢查 Microsoft Visual C Redistributab…

Linux中ssh遠程登錄原理與配置

SSH連接的五個階段 1. 版本協商階段(Protocol Version Negotiation)目的:協商使用SSH-1或SSH-2協議(現代系統默認SSH-2)。流程:關鍵點:若版本不兼容(如客戶端只支持SSH-1&#xff0c…

Kubernetes --存儲入門

一、Volume 的概念對于大多數的項目而言,數據文件的存儲是非常常見的需求,比如存儲用戶上傳的頭像、文件以及數據庫的數據。在 Kubernetes 中,由于應用的部署具有高度的可擴展性和編排能力(不像傳統架構部署在固定的位置&#xff…

螞蟻 KAG 框架開源:知識圖譜 + RAG 雙引擎

引言:從RAG到KAG,專業領域知識服務的技術突破 在大語言模型(LLM)應用落地過程中,檢索增強生成(RAG) 技術通過引入外部知識庫有效緩解了模型幻覺問題,但在專業領域仍面臨三大核心挑戰…

V-Ray 7.00.08 for 3ds Max 2021-2026 安裝與配置教程(含語言補丁)

本文介紹 V-Ray 7.00.08 渲染器在 3ds Max 2021-2026 各版本中的安裝與使用配置步驟,適合需要進行可視化渲染工作的設計師、建筑師及相關從業者。附帶語言補丁配置方式,幫助用戶獲得更順暢的使用體驗。 📁 一、安裝文件準備 軟件名稱&#xf…

Go-Elasticsearch Typed Client查詢請求的兩種寫法強類型 Request 與 Raw JSON

1 為什么需要兩種寫法? 在 Golang 項目中訪問 Elasticsearch,一般會遇到兩類需求:需求場景特點最佳寫法后臺服務 / 業務邏輯查詢固定、字段清晰,需要編譯期保障Request 結構體儀表盤 / 高級搜索 / 模板 DSL查詢片段由前端或腳本動…

Leaflet 綜合案例-聚類圖層控制

看過的知識不等于學會。唯有用心總結、系統記錄,并通過溫故知新反復實踐,才能真正掌握一二 作為一名摸爬滾打三年的前端開發,開源社區給了我飯碗,我也將所學的知識體系回饋給大家,助你少走彎路! OpenLayers…

React組件中的this指向問題

在 React 組件中,函數定義方式影響this指向的核心原因是箭頭函數與普通函數的作用域綁定規則不同,具體差異如下:? 1. 普通函數(function定義)需要手動bind(this)的原因? 當用function在組件內定義方法時&#xff1…

Vue 項目中的組件引用如何實現,依賴組件間的數據功能交互及示例演示

在 Vue 項目中,組件間的引用與數據交互是核心功能之一。以下是組件引用和數據交互的詳細實現方式及示例:一、組件引用方式 1. 基本組件引用 局部注冊:在父組件中按需引入子組件并注冊。 // ParentComponent.vue import ChildComponent from .…

? 使用 Flask 實現頭像文件上傳與加載功能

文章目錄&#x1f9f1; 技術棧&#x1f5c2;? 項目結構與配置&#x1f510; 用戶身份校驗邏輯&#x1f4e4; 頭像上傳接口&#xff1a;/file/avatar/upload&#x1f4e5; 加載頭像接口&#xff1a;/file/avatar/load/<filename>&#x1f9ea; 示例請求&#xff08;使用 …

去除視頻字幕 5: 使用 ProPainter, 記錄探索過程

使用 ProPainter 去除視頻上的字幕&#xff0c;效果演示&#xff08;比之前好多了。&#xff09;。 1. 項目目標 去除視頻 (bear.webm) 中的硬字幕。 2. 初始嘗試與關鍵失敗&#xff1a;IOPaint 方法: 使用 IOPaint&#xff08;一個圖像修復工具&#xff09;配合 PaddleOCR 逐…

JavaScript HTTP 請求:從老古董到新潮流

前端開發離不開跟后端打交道&#xff0c;HTTP 請求就是這座橋梁。JavaScript 提供了好幾種方式來發請求&#xff0c;從老牌的 XMLHttpRequest (XHR) 到現代的 Fetch API&#xff0c;再到各種好用的第三方庫&#xff08;像 Axios、Ky、Superagent&#xff09;。咱們一個一個聊清…

Windows10系統使用Cmake4.1.0構建工具+Visual Studio2022編譯Opencv4.11教程

安裝提示 后續安裝本Cmake和Opencv版本及以上都可以。Microsoft Visual Studio2022已默認安裝&#xff0c;沒有安裝給出教程鏈接。 一、Cmake4.1.0下載 1.官網下載&#xff1a;https://cmake.org/download/&#xff0c;找到cmake-4.1.0-rc3-windows-x86_64.zip版本 2.壓縮包…

【性能測試】Jmeter+Grafana+InfluxDB+Prometheus Windows安裝部署教程

一、工具作用與整體架構 1.1 各工具核心作用 工具作用描述關鍵特性Jmeter性能測試工具&#xff0c;模擬多用戶并發請求&#xff0c;生成測試數據支持HTTP/HTTPS、數據庫等多種協議&#xff0c;可自定義測試場景InfluxDB時序數據庫&#xff0c;專門存儲時間序列數據&#xff0…

【Kubernetes】使用Deployment進行的資源調度,資源清理,伸縮與更新管控

Kubernetes Deployment 實戰&#xff1a;從資源清理到伸縮與更新管控 一、基礎準備&#xff1a;清理閑置 ReplicaSet 在使用 Deployment 時&#xff0c;每次更新都會生成新的 ReplicaSet&#xff08;簡稱 RS&#xff09;&#xff0c;舊的 RS 會被保留但設置為 DESIRED0。這些閑…

stm32使用USB虛擬串口,因電腦缺少官方驅動而識別失敗(全系列32單片機可用)

驅動下載地址 官網地址&#xff1a;https://www.st.com/en/development-tools/stsw-stm32102.html