android应用之SQLite数据库

安卓db数据库查看工具——快速管理与分析SQLite数据库 SQLite 是 Android 内置的轻量级关系型数据库管理系统,为 Android 应用提供了一种高效、便捷的数据持久化方案。与传统的关系型数据库不同,SQLite 将数据库存储在文件系统中的单一文件内,从而简化了数据库的部署和管理。SQLite 支持标准的 SQL 语言,允许在没有服务器进程的情况下进行数据库操作,这使得它非常适合于资源有限的移动设备环境。在 Android 应用开发中,SQLite 数据库常用于本地数据存储、用户个性化设置记录以及应用内缓存。 阅读详情

android系统内嵌了SQLite数据库,优点是处理速度快,占用内存少

在android应用中,围绕着数据库的操作主要是通过SQLiteDatabase来完成的,该类封装了以下方法:

方法用途
execSQL(sql)执行sql脚本,通常用来创建或管理数据库表格
rawQuery(sql,selectionArgs)执行select查询操作(sql语句的方式)
query(..)执行select查询操作(api的方式)
insert(table,nullColumnHack,values)向指定table中新增记录
update(table,values,whereClause,whereArgs)更新指定table中的指定记录
delete(table,whereClause,whereArgs)删除指定table中的指定记录
通过这些方法便可完成对数据库的增删改查操作,同时SQLiteDatabase也引入了对事物的支持
beginTransaction():开启事物
endTransaction():提交或回滚事物
相对于web应用来讲,移动客户端的本质区别在于系统的访问是单用户的,没有并发操作。因此,在数据库不存在并发写操作的前提下,事物的处理是可以不去考虑的。

SQLiteDatabase是通过SQLiteOpenHelper来获取的,该类是一个抽象类,开发基于数据库存储的android应用时,需要继承该类,构建出自己的SQLiteOpenHelper实例并覆盖其超类所声明的抽象方法:
onCreate(SQLiteDatabase db):用于创建数据库表格
onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion):用于更新数据库表结构
有了SQLiteOpenHelper之后,便可通过其getWritableDatabase()方法获取SQLiteDatabase对象,用以完成对数据库的CURD操作。

public class WordSQLiteHelper extends SQLiteOpenHelper{
	public static final String TABLE_WORDS = "words";
	public static final String COLUMN_ID = "_id";
	public static final String COLUMN_ENGLISH = "english";
	public static final String COLUMN_CHINESE = "chinese";
	public static final String COLUMN_PHRASE = "phrase";
	public static final String COLUMN_TRANSLATION = "translation";
	public static final String COLUMN_LEVEL = "level";
	private static final String DATABASE_NAME = "words.db";
	private static final int DATABASE_VERSION = 1;

	public WordSQLiteHelper(Context context){
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}
	@Override
	public void onCreate(SQLiteDatabase db) {
		StringBuilder sql=new StringBuilder("create table ").append(TABLE_WORDS).append("(")
				.append(COLUMN_ID).append(" integer primary key autoincrement,")
				.append(COLUMN_ENGLISH).append(" text not null,")
				.append(COLUMN_CHINESE).append(" text not null,")
				.append(COLUMN_PHRASE).append(" text not null,")
				.append(COLUMN_LEVEL).append(" real not null,")
				.append(COLUMN_TRANSLATION).append(" text not null);");
		db.execSQL(sql.toString());
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		Log.w(WordSQLiteHelper.class.getName(),"Upgrading database from version " + oldVersion + " to "
	            + newVersion + ", which will destroy all old data");
		db.execSQL("DROP TABLE IF EXISTS "+TABLE_WORDS);
		onCreate(db);
	}
}

在做web应用时,为了代码层次能够更加清晰,通常将其划分为3层结构(entity、dao和service)
dao的创建使得Service的编写变得更加容易,android应用可基于SQLiteDatabase对象构建出自己的Dao实例

public class WordDao implements IBaseDao<Word>{
	private SQLiteDatabase database;
	private WordSQLiteHelper dbHelper;
	private String[] allColumns={WordSQLiteHelper.COLUMN_ID,WordSQLiteHelper.COLUMN_ENGLISH,
			WordSQLiteHelper.COLUMN_CHINESE,WordSQLiteHelper.COLUMN_PHRASE,WordSQLiteHelper.COLUMN_TRANSLATION,WordSQLiteHelper.COLUMN_LEVEL};
	public WordDao(Context context){
		dbHelper=new WordSQLiteHelper(context);
	}
	public void open(){
		database=dbHelper.getWritableDatabase();
	}
	public void close(){
		dbHelper.close();
	}
	@Override
	public void create(Word word){
		ContentValues values = new ContentValues();
		values.put(WordSQLiteHelper.COLUMN_ENGLISH,word.getEnglish());
		values.put(WordSQLiteHelper.COLUMN_CHINESE,word.getChinese());
		values.put(WordSQLiteHelper.COLUMN_PHRASE,word.getPhrase());
		values.put(WordSQLiteHelper.COLUMN_TRANSLATION,word.getTranslation());
		values.put(WordSQLiteHelper.COLUMN_LEVEL,word.getLevel());
		long insertId=database.insert(WordSQLiteHelper.TABLE_WORDS,null,values);
		word.setId(insertId);
	}
	@Override
	public void update(Word word){
		ContentValues values = new ContentValues();
		values.put(WordSQLiteHelper.COLUMN_ENGLISH,word.getEnglish());
		values.put(WordSQLiteHelper.COLUMN_CHINESE,word.getChinese());
		values.put(WordSQLiteHelper.COLUMN_PHRASE,word.getPhrase());
		values.put(WordSQLiteHelper.COLUMN_TRANSLATION,word.getTranslation());
		values.put(WordSQLiteHelper.COLUMN_LEVEL,word.getLevel());
		database.update(WordSQLiteHelper.TABLE_WORDS,values,WordSQLiteHelper.COLUMN_ID+"="+word.getId(),null);
	}
	@Override
	public void delete(Word word){
		long id=word.getId();
		database.delete(WordSQLiteHelper.TABLE_WORDS,WordSQLiteHelper.COLUMN_ID+"="+id,null);
	}
	@Override
	public List<Word> getAll(){
		List<Word> words=new ArrayList<Word>();
		Cursor cursor = database.query(WordSQLiteHelper.TABLE_WORDS,
		        allColumns, null, null, null, null, null);
		//Cursor cursor=database.rawQuery("select * from "+WordSQLiteHelper.TABLE_WORDS,new String[]{});
		cursor.moveToFirst();
		while(!cursor.isAfterLast()){
			words.add(encapsulate(cursor));
			cursor.moveToNext();
		}
		cursor.close();
		return words;
	}
	@Override
	public List<Word> findOnePage(int offset,int num){
		List<Word> words=new ArrayList<Word>();
		Cursor cursor = database.query(WordSQLiteHelper.TABLE_WORDS,
		        allColumns, null, null, null, null, null);
		cursor.moveToFirst();
		cursor.move(offset);
		int i=0;
		while(!cursor.isAfterLast()){
			if(i==num){
				break;
			}
			words.add(encapsulate(cursor));
			cursor.moveToNext();
			i++;
		}
		cursor.close();
		return words;
	}
	@Override
	public int getCount(){
		Cursor cursor = database.query(WordSQLiteHelper.TABLE_WORDS,
		        allColumns, null, null, null, null, null);
		return cursor.getCount();
	}
	private Word encapsulate(Cursor cursor){
		Word word=new Word();
		word.setId(cursor.getLong(0));
		word.setEnglish(cursor.getString(1));
		word.setChinese(cursor.getString(2));
		word.setPhrase(cursor.getString(3));
		word.setTranslation(cursor.getString(4));
		word.setLevel(cursor.getFloat(5));
		return word;
	}
}
不同于Hibenrate的处理方式,这里的dao需要手动开启和关闭session(通过执行open和close方法),并且每个dao实例只封装一个session对象。

在web应用中,dao实例一般通过spring容器来管理的,引入容器确保了dao在系统中只存在一个实例,由于每个dao都封装了一个session,单实例的dao也避免了session资源的浪费。
我们可效仿spring的管理方式,编写自己的dao容器,同时,在容器中声明clear方法,当系统APP退出时,执行该方法对容器进行销毁,销毁容器的同时,关闭dao对应的session。

public class DaoContext {
	private Map<String,IBaseDao<?>> daoMap;
	private static DaoContext instance=new DaoContext();
	private DaoContext(){
		daoMap=new HashMap<String,IBaseDao<?>>();
	}
	public static DaoContext getInstance(){
		return instance;
	}
	public void addDao(IBaseDao<?> dao){
		String daoName=dao.getClass().getSimpleName();
		removeDao(daoName);
		daoMap.put(dao.getClass().getSimpleName(),dao);
		dao.open();
	}
	public void removeDao(String daoName){
		if(daoMap.containsKey(daoName)){
			daoMap.remove(daoName);
			IBaseDao<?> dao=getDao(daoName);
			dao.close();
		}
	}
	public IBaseDao<?> getDao(String daoName){
		return daoMap.get(daoName);
	}
	public void clear(){
		for(Entry<String, IBaseDao<?>> entry:daoMap.entrySet()){
			IBaseDao<?> dao=entry.getValue();
			dao.close();
		}
		daoMap.clear();
	}
}
SQLite数据库在Android开发中的深入应用 SQLite是一个轻量级的数据库,它不需要单独的服务器进程或系统来操作,而是直接嵌入到应用程序中。其核心特性包括:零配置:SQLite数据库不需要预配置,无需安装或管理。跨平台:支持跨平台使用,可以在Windows、Linux、MacOS、Android等系统上运行。单个文件数据库:所有数据(表、索引和触发器)都存储在一个单一的磁盘文件中。ACID事务:SQLite支持ACID事务,确保数据的完整性和一致性。小型和高效。 阅读详情

相关推荐

XE5 SQLite Demo:Android应用中的SQLite数据库实战

本文还有配套的精品资源,点击获取 简介:本课程设计项目旨在帮助学生掌握在Android应用中使用SQLite数据库的技术。SQLite是一款轻量级、开源的嵌入式数据库引擎,广泛应用于移动设备和桌面系统。通过本项目,学生将学习如何创建、查询、更新和删除SQLite数据库中的数据,并了解在Android应用中使用SQLite的最佳实践。此外,学生还将学习如何使用XE5的数据库组...

weixin_36123300的博客 465

安卓课程-----SQLite

SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。

cqn2bd2b的博客 393

从数据集到产品:聊聊Room-to-Room (R2R) 如何影响扫地机器人、AR导航的未来

本文探讨了Room-to-Room (R2R) 数据集如何推动视觉与语言导航(VLN)技术的发展,并重塑扫地机器人和AR导航的未来。通过分析R2R基于Matterport3D的设计及其在真实场景中的应用,揭示了其在提升智能导航精度和自然语言交互能力方面的潜力。文章还讨论了从实验室到产品化的关键技术挑战与解决方案。

weixin_29084231的博客 143

python 提取固定列名数据_python获取数据库列名

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户的数据库应用系统进行性能和风险评估,参与配合进行数据压测演练,提供数据库优化方面专业建议,在业务高峰期与用户共同保障数据库系统平...

weixin_39806288的博客 6251

MCGS触摸屏数据记录与U盘导出配置全解析

在工业自动化现场,数据记录是设备运行状态分析与故障追溯的基础。HMI触摸屏作为人机交互核心,不仅承担实时监控任务,还负责过程数据的存储与导出。理解数据采集周期、存盘机制与存储介质的匹配原理,能帮助工程师高效配置数据记录功能。合理运用定时存盘、存盘组与U盘导出,可支撑设备趋势分析、报表生成及事故排查。本文以MCGS触摸屏为例,详解数据记录的完整组态流程,并汇总常见配置陷阱与排查思路,为现场调试与长期运维提供可落地的技术参考。

weixin_34253126的博客 466

ST-CNN实战:用Python实现交通流量预测(附完整代码)

本文详细介绍了如何利用时空卷积神经网络(ST-CNN)进行交通流量预测的实战过程。通过Python和PyTorch,从数据预处理、构建邻接矩阵,到ST-CNN核心模块的代码实现与模型训练,提供了完整的解决方案,帮助开发者掌握处理时空序列数据的核心算法。

rust6ferris的博客 928

有关SQLite的优缺点

★技术上的优点和特性 SQLite是一个轻量级、跨平台的关系型数据库。既然号称关系型数据库,支持SQL92标准中常用的玩意儿(比如视图、事务、触发器等)就是理所当然的了,咱今天就不细说了。今天主要聊聊一些有点特色的玩意儿。 ◇轻量级 先说它的第一个特色:轻量级。想必SQLite的作者很看重这个特性,连它的Logo都是用的“羽毛”,来显摆它的轻飘飘。 SQLite和C/S模式的数据库软件不同

smile丶hm的博客 2万+

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

Robot_PLC_HMI_Automation 6518

详细了解SQLITE 优缺点 性能测试

http://blog.sina.com.cn/s/blog_8cfbb9920100zetj.html 什么是SQLITE: SQLite是一个开源免费的数据库,一般用于嵌入系统或者小规模的应用软件开发中,你可以像使用Access一样使用它,你可以免费用于任何应用,包括商业应用,另外,它还支持各种平台和开发工具,这点是某些数据库(比如Access、DBISAM)。 SQLite是一种嵌入式数据库,它跟微软的Access差不多,只是一个.db格式的文件。但是与Access不同的是,它不需..

木牛的博客 1万+

深度拆解 ‘High-Frequency Trading’ (HFT) 系统:解析如何在 100 纳秒内完成从网卡到 C++ 策略的响应

在100纳秒内完成从网卡到C++策略的响应,这是一项对技术栈每一个层面都进行极限优化的系统工程。它要求我们深入理解计算机体系结构、操作系统、网络协议和C++语言的底层机制。从物理距离的极致缩短,到高性能网卡和内核旁路技术,再到C++代码中每一个字节、每一个CPU周期的精打细算,HFT系统展现了人类对计算速度的永恒追求。这项技术不仅仅应用于金融交易,其背后的低延迟理念和实现方法,如DPDK、无锁编程、硬件加速等,正在逐渐渗透到其他对延迟敏感的领域,例如电信网络、边缘计算和工业自动化。

weixin_41455464的博客 1039

从 Open SQL JOIN 走向 ABAP CDS Association:把查询写成可复用的数据模型

摘要: 本文通过飞行模型示例,对比了ABAP中三种表关联实现方式:Open SQL JOIN、CDS显式JOIN和CDS Association。重点解析了Association的本质是将表关系声明为数据模型语言,使用时通过路径表达式按需展开为JOIN。文章指出路径表达式在不同位置会默认展开为不同JOIN类型(如SELECT列表默认为LEFT OUTER),并演示了如何用[inner]强制指定INNER JOIN。最后结合S/4HANA实际案例,说明Association通过中心化关系定义和路径复用,能有效

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 386

sqlite的优缺点

SQLite在Android的开发中经常用到,但是SQLite的优缺点,没有研究过,也不知道使用SQLite的过程中会出现什么问题。直到面试的时候,面试官问了下SQLite的缺点是什么的时候,没有答上来。时候查了下资料,找到了一些粗略的点如下: 1.优点:SQLite是轻量级的,没有客户端和服务器端之分,并且是跨平台的关系型数据库。SQLite是一个单文件的,可以copy出来在其他地方用。 2

u011633245的专栏 6506

Linux C/C++ or 嵌入式面试之《C/C++笔面试系列》(10) C++ 前置后置增减运算符重载形式与比较

C语言的++、–运算符在此不讨论。 文章目录1、前置后置增减运算符重载的形式2、前置和后置运算符的性能比较 1、前置后置增减运算符重载的形式 自增运算符“++”和自减运算符“–”分别包含两个版本。即运算符前置形式(如 ++x)和运算符后置形式(如 x++),这两者进行的操作是不一样的。因此,当我们在对这两个运算符进行重载时,就必须区分前置和后置形式。C++根据参数的个数来区分前置和后置形式。如果按照通常的方法来重载 ++ 运算符(即作为成员函数重载时不带参数,或者作为非成员函数重载时带有一个参数),那么重载

二进制君 5834

android8 factory.db,Android SQLite数据库应用技巧分享

Android操作系统中内置了SQLite数据库!我们在应用程序开发中都需要对数据库进行相关操作。在这里大家就一起来看看有关Android SQLite数据库的应用技巧,方便将来的应用。更多技术文章分享SQLite本身就是一个很小型的数据库!数据库存储的位置在data/data//databases/1:Android SQLite数据库创建数据库1.Context.createDatabase(...

weixin_39755952的博客 143

【Bug已解决】Codex CLI 运行时出现 command not found: codex 解决方案

方案适用场景推荐指数修复 PATH 配置最常见的基础排查方向⭐⭐⭐⭐⭐检查原生二进制完整性PATH 正常但执行仍然异常⭐⭐⭐⭐统一包管理器混用多种包管理器导致混乱⭐⭐⭐⭐确认安装脚本未被跳过CI/CD 或企业策略环境⭐⭐⭐⭐排查网络下载渠道企业内网/受限网络环境⭐⭐⭐需要留意 warning 中是否涉及脚本执行失败、网络超时重试等信息,这类 warning 往往是后续问题的前兆,建议出现明显的下载/网络相关警告时就主动重新安装一次确认。Codex CLI 报。

一键难忘的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android 导出应用的数据库的两种常用方法,db查看器 SQLite Expert Personal下载

首先手机USB接入电脑,设置可通过USB传输文件 方法1:window键+R 打开命令行 依次输入以下命令 ①adb shell            ②run-as 应用包名    ③cd databases      //进入应用数据文件 ④ls                        //查看当前应用的所有数据库 ⑤cat或cp  数据库名.db&gt;/sdcard/数据库...

麦小洛 2843

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

在 Android 应用程序中使用 SQLite 数据库以及怎么用

在 Android 应用程序中使用 SQLite 数据库以及怎么用....如果你想要开发 Android 应用程序,一定需要在 Android 上存储数据,使用 SQLite 数据库是一种非常好的选择。本文介绍了如何在 Android 应用程序中使用 SQLite 数据库 ,主要介绍了在 Android 应用程序中使用 SQLite 创建数据库和表、添加数据、更新和检索数据,还介绍了比较常用的 SQLite 管理工具,通过阅读本文,你可以在 Android 中轻松操作 SQLite 数据库。

zhuangyalei的专栏 6176

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Android中应用SQLite轻型数据库(一)新建数据库

①应用SQLite,首先需了解SQLiteHelper类,写一个类继承它,并实现里面的构造方法和重写它的onCreate以及onUpgrade方法。 public class DatabaseHelper extends SQLiteOpenHelper { // 分别是上下文、数据库名称、游标工厂(使用默认的null)和版本号,数据库名称和版本号可以放在常量类里,用public static...

qq_27664947的博客 316

Android SQLite在应用中数据保存查询,但是拷贝的xxx.db没有数据或没有更新,.db_wal和.db_shm文件

Android SQLite在应用中数据保存能查询,但是拷贝的xxx.db没有数据或没有更新问题,.db_wal和.db_shm文件是什么 文章目录问题原因解决方法SQLite的.db_wal和.db_shm文件 问题 拷贝ROOM数据库data/data/com.xxx.xxx/databases/xxx.db到Windows下,使用DB browser for SQLite工具打开,发现数据没有更新。但是debug应用,使用ROOM保存数据,保存成功并且能查询到数据,但是拷贝出来的xxx.db就是没.

Gyso的博客 2619

android之SQLite数据库应用(二)

今天让我们总结下SQLite数据库在android系统中的应用。首先来看一些数据库的介绍:      SQLite数据库是一种无类型的数据库,这就代表你可以保存任何类型的数据到任何表中的任何列哦,无论这个表在create的时候该列被声明成什么类型。因为SQLite在执行数据库建表语句的时候,会自动的将类型忽略的哦。     它是一种用C语言编写的嵌入式数据库,它是一个轻量级的数据库,在一些基础简单的语句处理上要比oracle/mysql快很多,而且其对内存的要求很低。     注意:这里一定要注意,SQLi

梦中一夜下江南 1万+

linux上安卓mysql,如何在Android应用中使用已有的SQLite数据库

在我几个Android应用中,我需要访问已有的数据库。这些数据库往往很大,甚至超过asset文件大约1兆字节的限制。而且在新的版本中数据库需要更新。我在网上,特别是StackOverflow看了一些文章,并做了一些试验,觉得下面的代码能基本上满足我的需求。其主要思路是:1. 把数据库分解成几个asset文件。2. 当需要打开数据库时,如果数据库不存在,就把那几个asset文件重新合并成一个...

weixin_39734184的博客 144

安卓视频开发 mysql_在Android应用中使用SQLite数据库(传智播客视频笔记)

在Android应用中使用SQLite数据库应用生成的数据库文件保存为/data/data/应用包名/databases/name.db,生成的文件可用SQLite Expert打开(name是自定义的,例如,我的应用是保存在:/data/data/com.sinaapp.sql/databases/ssun.db中)SQLiteActivity.java源码:package com.sinaap...

weixin_30817835的博客 180

【Android 逆向】使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )

一、从 Android 应用数据目录中拷贝 SQlite3 数据库文件、 二、使用 DB Browser 工具打开 SQlite3 数据库文件

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3711

java 安卓 sqlite数据库,Android应用中内嵌SQLite数据库的基本操作指南

一、首先写一个类继承SQLiteOpenHelper类重写他的方法指定db的名称、版本,重写oncreat和onUpgrade方法,写SQL语句创建表public class MySQLiteOpenhelper extends SQLiteOpenHelper {private static String name = "person.db";private static int version...

weixin_39969060的博客 594

在Android应用程序中保存到SQLite数据库

这是我系列中有关在Android应用程序中保存数据的第四篇文章。 这是其他帖子: 简介:如何在Android应用程序中保存数据 将数据保存到Android应用程序中的文件 在您的Android应用程序中保存首选项 先前的帖子介绍了如何将文件保存到文件系统和首选项文件。 如果对于一个简单的应用程序,这就足够了,但是如果您的数据具有复杂的结构,或者如果您要保存很多数据,那么使用数据库...

499

安卓SQLite数据库存储简单应用

2020.8.27 Android学习案例 1.创建数据库 MyHelper.class class MyHelper extends SQLiteOpenHelper { public MyHelper(@Nullable Context context) { super(context, "dnf", null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.ex

qq_46075526的博客 362
上一篇: 云计算概念
下一篇: SpringAOP应用(AspectJ)
JavaMan_chen
博客等级 码龄19年 329粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值