java android持久化數據

1. SQLite 數據庫(Android 內置)

1.1 創建數據庫幫助類

public class DatabaseHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = "MyDatabase.db";private static final int DATABASE_VERSION = 1;// 表名和列名public static final String TABLE_USERS = "users";public static final String COLUMN_ID = "_id";public static final String COLUMN_NAME = "name";public static final String COLUMN_EMAIL = "email";// 創建表的SQL語句private static final String CREATE_TABLE_USERS = "CREATE TABLE " + TABLE_USERS + " (" +COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +COLUMN_NAME + " TEXT NOT NULL, " +COLUMN_EMAIL + " TEXT);";public DatabaseHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_TABLE_USERS);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("DROP TABLE IF EXISTS " + TABLE_USERS);onCreate(db);}
}

1.2 數據庫操作示例

public class DatabaseOperations {private DatabaseHelper dbHelper;private SQLiteDatabase database;public DatabaseOperations(Context context) {dbHelper = new DatabaseHelper(context);}public void open() throws SQLException {database = dbHelper.getWritableDatabase();}public void close() {dbHelper.close();}// 插入數據public long insertUser(String name, String email) {ContentValues values = new ContentValues();values.put(DatabaseHelper.COLUMN_NAME, name);values.put(DatabaseHelper.COLUMN_EMAIL, email);return database.insert(DatabaseHelper.TABLE_USERS, null, values);}// 查詢所有用戶public Cursor getAllUsers() {String[] columns = {DatabaseHelper.COLUMN_ID,DatabaseHelper.COLUMN_NAME,DatabaseHelper.COLUMN_EMAIL};return database.query(DatabaseHelper.TABLE_USERS, columns, null, null, null, null, null);}// 更新用戶public int updateUser(long id, String name, String email) {ContentValues values = new ContentValues();values.put(DatabaseHelper.COLUMN_NAME, name);values.put(DatabaseHelper.COLUMN_EMAIL, email);return database.update(DatabaseHelper.TABLE_USERS, values, DatabaseHelper.COLUMN_ID + " = " + id, null);}// 刪除用戶public void deleteUser(long id) {database.delete(DatabaseHelper.TABLE_USERS, DatabaseHelper.COLUMN_ID + " = " + id, null);}
}

1.3 在Activity中使用

public class MainActivity extends AppCompatActivity {private DatabaseOperations dbOperations;private ListView listView;private SimpleCursorAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);dbOperations = new DatabaseOperations(this);dbOperations.open();listView = findViewById(R.id.listView);// 添加一些示例數據dbOperations.insertUser("張三", "zhangsan@example.com");dbOperations.insertUser("李四", "lisi@example.com");displayUsers();}private void displayUsers() {Cursor cursor = dbOperations.getAllUsers();String[] fromColumns = {DatabaseHelper.COLUMN_NAME, DatabaseHelper.COLUMN_EMAIL};int[] toViews = {R.id.textName, R.id.textEmail};adapter = new SimpleCursorAdapter(this, R.layout.user_item, cursor, fromColumns, toViews, 0);listView.setAdapter(adapter);}@Overrideprotected void onDestroy() {super.onDestroy();dbOperations.close();}
}

2. Room 持久化庫(推薦)

2.1 添加依賴

build.gradle 文件中添加:

implementation "androidx.room:room-runtime:2.4.0"
annotationProcessor "androidx.room:room-compiler:2.4.0"

2.2 創建實體類

@Entity(tableName = "users")
public class User {@PrimaryKey(autoGenerate = true)public int id;@ColumnInfo(name = "name")public String name;@ColumnInfo(name = "email")public String email;// 構造函數、getter和setter
}

2.3 創建DAO接口

@Dao
public interface UserDao {@Insertvoid insert(User user);@Updatevoid update(User user);@Deletevoid delete(User user);@Query("SELECT * FROM users")List<User> getAllUsers();@Query("SELECT * FROM users WHERE id = :userId")User getUserById(int userId);
}

2.4 創建數據庫類

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {public abstract UserDao userDao();private static volatile AppDatabase INSTANCE;public static AppDatabase getDatabase(final Context context) {if (INSTANCE == null) {synchronized (AppDatabase.class) {if (INSTANCE == null) {INSTANCE = Room.databaseBuilder(context.getApplicationContext(),AppDatabase.class, "app_database").build();}}}return INSTANCE;}
}

2.5 在Activity中使用

public class MainActivity extends AppCompatActivity {private AppDatabase db;private UserDao userDao;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);db = AppDatabase.getDatabase(this);userDao = db.userDao();// 在后臺線程執行數據庫操作new Thread(() -> {// 插入用戶User user = new User();user.name = "王五";user.email = "wangwu@example.com";userDao.insert(user);// 查詢用戶List<User> users = userDao.getAllUsers();runOnUiThread(() -> {// 更新UI});}).start();}
}

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

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

相關文章

鴻蒙動畫與交互設計:ArkUI 3D變換與手勢事件詳解

大家好&#xff0c;我是 V 哥。 在鴻蒙 NEXT 開發中&#xff0c;ArkUI 提供了豐富的 3D 變換和手勢事件功能&#xff0c;可用于創建生動且交互性強的用戶界面。下面詳細介紹 ArkUI 的 3D 變換和手勢事件&#xff0c;并給出相應的 ArkTS 案例代碼。 1. ArkUI 3D 變換 ArkUI 支…

HTTP 和 HTTPS 協議的區別及使用場景

在互聯網的世界里,HTTP 和 HTTPS 是我們經常接觸到的兩種網絡協議,它們在數據傳輸、安全性等方面存在諸多差異,適用的場景也各有不同。? 一、HTTP 和 HTTPS 的基本概念? HTTP,即超文本傳輸協議(Hyper - Text Transfer Protocol),是一種用于分布式、協作式和超媒體信息…

【微服務管理】注冊中心:分布式系統的基石

在分布式系統日益普及的當下&#xff0c;如何高效地管理眾多服務實例成為關鍵問題。注冊中心應運而生&#xff0c;它猶如分布式系統的 “指揮中樞”&#xff0c;承擔著服務注冊、發現等核心任務&#xff0c;為整個系統的穩定運行和高效協作提供堅實保障。本文將深入探討注冊中心…

高并發短信系統設計:基于SharingJDBC的分庫分表、大數據同步與實時計算方案

高并發短信系統設計&#xff1a;基于SharingJDBC的分庫分表、大數據同步與實時計算方案 一、概述 在當今互聯網應用中&#xff0c;短信服務是極為重要的一環。面對每天發送2000萬條短信的需求&#xff0c;我們需要一個能夠處理海量數據&#xff08;一年下來達到數千萬億級別&…

2025最新系統 Git 教程(七)(完結)

第4章 分布式Git 4.1 分布式 Git - 分布式工作流程 你現在擁有了一個遠程 Git 版本庫&#xff0c;能為所有開發者共享代碼提供服務&#xff0c;在一個本地工作流程下&#xff0c;你也已經熟悉了基本 Git 命令。你現在可以學習如何利用 Git 提供的一些分布式工作流程了。 這一…

OpenCV 圖像旋轉

一、OpenCV 圖像旋轉介紹 在計算機視覺和圖像處理領域&#xff0c;圖像旋轉是指將圖像圍繞某個中心點按照一定的角度進行轉動。旋轉操作會改變圖像中像素的位置&#xff0c;從而得到新的圖像布局。這一操作在很多場景中都有重要應用&#xff0c;比如文檔矯正、目標檢測時對圖像…

<C#>在 .NET 開發中,依賴注入, 注冊一個接口的多個實現

在 .NET 開發里&#xff0c;有時一個接口會有多個實現類&#xff0c;此時就需要向依賴注入容器注冊多個實現。下面會詳細介紹不同場景下如何注冊多個實現&#xff0c;以及怎樣從容器中解析這些實現。 1. 注冊多個實現 在 .NET 中&#xff0c;依賴注入容器可以通過不同方式注冊…

idea 保存格式化 但是不格式化 Xml

xml- 其他 - 保持空格勾選上 https://blog.csdn.net/m0_65724734/article/details/128378290?spm1001.2101.3001.6650.8&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-128378290-blog-135147277.235%5Ev43%5Epc_blog_bo…

如何在C++中優雅地繪制圖表

如何在C項目中優雅地繪制圖表 matplotlibpreparematplotlibcpp.hpython3vs configuretest Gnuplotpreparegnuplotgnuplot-iostream.hboostvs configuretest MathGL 在C項目中&#xff0c;在進行一些數據分析時往往不夠直觀&#xff0c;若能借助圖表進行分析可以達到事半功倍的效…

vue3使用keep-alive緩存組件與踩坑日記

目錄 一.了解一下KeepAlive 二.使用keep-alive標簽緩存組件 1.聲明Home頁面名稱 三.在路由出口使用keep-alive標簽 四.踩坑點1&#xff1a;可能需要配置路由&#xff08;第三點完成后有效可忽略&#xff09; 五.踩坑點2&#xff1a;沒有找到正確的路由出口 一.了解一下Kee…

ros通信機制學習——latched持久化機制

點云的地圖的發送邏輯中&#xff0c;我發現每次使用rostopic echo 時只會打印一次&#xff0c;然后就不會再打印了。并且rviz中也是始終都會顯示的&#xff0c;這里面其實就是用到了latched持久話機制&#xff0c;可以接受這最后一次發布的消息。 我們通過一個具體的項目來學習…

力扣每日打卡 1922. 統計好數字的數目 (中等)

力扣 1922. 統計好數字的數目 中等 前言一、題目內容二、解題方法1. 暴力解法&#xff08;會超時&#xff0c;此法不通&#xff09;2. 快速冪運算3. 組合計數的思維邏輯分析組合計數的推導例子分析思維小結論 4.官方題解4.1 方法一&#xff1a;快速冪 三、快速冪運算快速冪運算…

如何使用通義靈碼玩轉Docker - AI助手提升開發效率

一、引言 Docker 作為一種流行的虛擬化技術&#xff0c;能夠幫助開發者快速搭建所需的運行環境。然而&#xff0c;對于初學者來說&#xff0c;掌握 Docker 的基本概念和使用方法可能會遇到一些挑戰。本文將介紹如何利用通義靈碼這一智能編碼助手&#xff0c;幫助你更高效地學習…

從一到無窮大 #45:InfluxDB MCP Server 構建:從工程實踐到價值重構

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。 本作品 (李兆龍 博文, 由 李兆龍 創作)&#xff0c;由 李兆龍 確認&#xff0c;轉載請注明版權。 文章目錄 工程實踐遇到的問題MCP Host選擇開發流程 結果展現可能性展望工作生活帶來的變化 MCP…

JAVA SDK通過proxy對接google: GCS/FCM

前言&#xff1a;因為國內調用google相關api需要通過代理訪問(不想設置全局代理)&#xff0c;所以在代理這里經常遇到問題&#xff0c;先說一下結論 GCS 需要設置全局代理或自定義代理選擇器&#xff0c; FCM sdk admin 在初始化firebaseApp時是支持設置的。 GCS: 開始時嘗試在…

【NLP】24. spaCy 教程:自然語言處理核心操作指南(進階)

spaCy 中文教程&#xff1a;自然語言處理核心操作指南&#xff08;進階&#xff09; 1. 識別文本中帶有“百分號”的數字 import spacy# 創建一個空的英文語言模型 nlp spacy.blank("en")# 處理輸入文本 doc nlp("In 1990, more than 60% of people in East…

關于香橙派OrangePi 5 Ultra 這個開源板子,開發Android

我下載了它資料中的開源Android13 系統SDK&#xff0c; 這個SDK連個git 都沒有&#xff0c;把這種代碼釋放能稱為開源嗎&#xff1f;&#xff1f; 并且也就是說你買了這個板子&#xff0c;里面是沒有任何關于RK3588的開發文檔&#xff0c;如果你沒玩過其他RK平臺&#xff0c;估…

WHAT - React Portal 機制:將子組件渲染到 DOM 的指定節點

文章目錄 適合場景基本語法示例&#xff1a;Modal 彈窗1. 創建一個簡單的 Modal.tsx2. 在 App 中使用 為什么要用 Portal&#xff1f;TypeScript 中 Portal 類型定義&#xff1f; 適合場景 React Portal 是 React 提供的一種機制&#xff0c;讓你可以將子組件渲染到 DOM 的指定…

數據結構---跳表

目錄 一、跳表的概念 為什么要使用隨機值來確定層高 二、跳表的分析 &#xff08;1&#xff09;查找過程 &#xff08;2&#xff09;性能分析 三、跳表的實現 四、與紅黑樹哈希表的對比 skiplist本質上也是一種查找結構&#xff0c;用于解決算法中的查找問題&#xff0c…

PCDN通過個人路由器,用更靠近用戶的節點來分發內容,從而達到更快地網絡反應速度

PCDN&#xff08;P2P CDN&#xff09;的核心思想正是利用個人路由器、家庭寬帶設備等分布式邊緣節點&#xff0c;通過就近分發內容來降低延遲、提升網絡響應速度&#xff0c;同時降低傳統CDN的帶寬成本。以下是其技術原理和優勢的詳細分析&#xff1a; 1. 為什么PCDN能更快&…