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.mzph.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能更快&…