Android数据存储之SQLite数据库存储

Android数据存储技术之SQLite数据库详解         前面介绍过文件存储和SharedPreferences存储,这两种方式只适合存储一些简单的数据,当需要存储大量的复杂数据的时候就需要用到SQLite数据库了。         Android专门提供了一个SQLiteOpenHelper类来帮助创建和升级数据库。SQLiteOpenHelper类是一个抽象类,类里面有两个抽象方法:onCreate()和onUpgrade(),一个... 阅读详情

 

      文件存储和SharedPreferences存储只适应保存简单的数据和键值对,而SQLite数据库是专门应对大数据存储。

      SQLite数据库能存储复杂的类型数据之外,还有占用资源少、运行速度快、适合在移动设备上使用等优点。简单的说SQLite数据库是一款轻量级的关系型数据库。同时,SQLite数据库又比其他的数据库简单的多,比如mySQL数据库。SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。

      为了方便管理数据库,专门提供了一个SQLiteOpenHelper帮助类。既然是帮助帮助类,都帮了些什么呢?可以说借助这个类我们可以对数据库进行创建和升级;比如需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据表结构进行更新。SQLiteOpenHelper虽说是个帮助类,其实SQLiteOpenHelper本身是个抽象类。想和SQLiteOpenHelper做朋友先从它的三个二开始吧!

第一个二:抽象类一般都需要写一个类继承它且重写它的方法。

//用于初次使用软件时生成数据库表
@Override
public void onCreate(SQLiteDatabase db) {
}
//用于升级软件时更新数据库表结构
@Override
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
}

第二个二:SQLiteOpenHelper 中还有两个非常重要的实例方法:getReadableDatabase() 和 getWritableDatabase()。getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,如果内存不足,getReadableDatabase()方法还回的对象是只读方式,getWritableDatabase()方法会报错。

第三个二:类都是有构造方法的,可以用系统默认的构造方法,可以自己重写构造方法。SQLiteOpenHelper中可提供两个构造方法重写,大家都用参数少的那个构造方法。

 

//context对数据进行操作,name是数据库名,factory表示允许我们在查询数据
//时返回一个自定义的Cursor,一般是传入null,version:数据库版本号
public MySQLite(Context context, String name,
                SQLiteDatabase.CursorFactory factory, int version) {
    super(context, name, factory, version);
}

       构建出 SQLiteOpenHelper 的实例之后,再调用它的 getReadableDatabase() 或 getWritableDatabase() 方法就能够创建数据库了,数据库文件会存放在 /data/data/<包名>/database/ 目录下。SQLiteOpenHelper数据类型:integer整型,real浮点型,text文本型,blob二进制型。

 

      SQLiteOpenHelper创建和升级数据库:升级数据库的时候记得改下版本号。

package com.xhm.demo.myandroidsql;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
/**
 * Created by Dell on 2017/3/28.
 */
public class MySQLite extends SQLiteOpenHelper {
    public static final String CREATE_BOOK="create table Book("
            +"id integer primary key autoincrement,"
            +"author text,"
            +"price real,"
            +"pages integer,"
            +"name text)";
    public static final String CREATE_CATEGORY="create table Category("
            +"id integer primary key autoincrement,"
            +"category_name text"
            +"category_code integer)";

    private Context mContext;
    //context对数据进行操作,name是数据库名,factory表示允许我们在查询数据
    //时返回一个自定义的Cursor,一般是传入null,version:数据库版本号
    public MySQLite(Context context, String name,
                    SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext=context;
    }
    //用于初次使用软件时生成数据库表
    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建数据库的同时创建Book表
        db.execSQL(CREATE_BOOK);
        db.execSQL(CREATE_CATEGORY);
        Toast.makeText(mContext, "Create succeeded",
                Toast.LENGTH_SHORT).show();
    }
    //用于升级软件时更新数据库表结构
    @Override
    public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
        db.execSQL("drop table if exists Book");
        db.execSQL("drop table if exists Category");
        onCreate(db);
    }
}
package com.xhm.demo.myandroidsql;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class SQLiteActivity extends Activity {
    private MySQLite dbHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sqlite);
        //构建一个MyDatabaseHelper对象,
        // 通过构造函数将数据库名指定为BookStore.db
        dbHelper=new MySQLite(this,"BookStore.db",null,2);
        Button buttonData=(Button) findViewById(R.id.create_database);
        buttonData.setOnClickListener(new View.OnClickListener() {
            /**
             *调用getWritableDatabase() 方法
             * 自动检测当前程序中 BookStore.db 这个数据库
             * 如果不存在则创建该数据库并调用 onCreate() 方法
             * 同时Book表也会被创建
             */
            @Override
            public void onClick(View v) {
                dbHelper.getWritableDatabase();
            }
        });
    }
}

       SQL语句都有增(insert)改(update)删(delete)查(query),SQLiteOpenHelper又是如何实现的呢?当你一个人无能为力的时候就找个对象呗!(开玩笑);其实啊!在调用SQLiteOpenHelper的getReadableDatabase() 或 getWritableDatabase() 方法时都会返回一个SQLiteDatabase对象,有了这个对象就可以进行增改删查咯!

向表中添加数据:

Button insertData=(Button) findViewById(R.id.insert_data);
insertData.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        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);
        /**
         * 这里SQLiteDatabase提供了添加数据的方法,
         * insert(String table,String nullColumnHack,ContentValues values)
         * table表示是表名,nullColumnHack一般用不上,传入null就行,
         * values表示一个ContentValues对象,提供put()方法重载,用于向
         * ContentValues中添加数据。
         */
    }
});

更新表中的数据:

 

Button updateData=(Button) findViewById(R.id.update_data);
updateData.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        SQLiteDatabase db=dbHelper.getWritableDatabase();
        ContentValues values=new ContentValues();
        //更改价格
        values.put("price",10.99);
        db.update("Book",values,"name=?",
                new String[]{"The Da Vinci Code"});
        /**
         * 这里SQLiteDatabase提供了更新数据的方法,
         * update(String table,ContentValues values,
         * String whereClause,String[]{whereArgs})
         *table表示是表名,values表示一个ContentValues对象
         * whereClause(对应SQL语句的where)和whereArgs:
         * 指定具体更新那几行.
         */
    }
});

删除表中的数据:

 

 

Button deleteData=(Button) findViewById(R.id.delete_data);
deleteData.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        SQLiteDatabase db=dbHelper.getWritableDatabase();
        db.delete("Book","pages>?",new String[]{"500"});
        /**
         * 这里SQLiteDatabase提供了删除数据的方法,
         *delete(String table,String whereClause,
         * String[]{whereArgs}),删除数据和更新数据很相似,
         * 就差了个ContentValues values,第二第三参数用于
         * 指定删除某行或某几行的数据。
         * */
    }
});

查询表中的所有数据:

 

Button queryData=(Button) findViewById(R.id.query_data);
queryData.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        SQLiteDatabase db=dbHelper.getWritableDatabase();
        Cursor cursor=db.query("Book",null,null,
                null,null,null,null);
        if (cursor.moveToFirst()){
            do {
                //查询Book表中所有的数据
                String name=cursor.getString(
                        cursor.getColumnIndex("name"));
                String author=cursor.getString(
                        cursor.getColumnIndex("author"));
                int pages=cursor.getInt(
                        cursor.getColumnIndex("pages"));
                double price=cursor.getDouble(
                        cursor.getColumnIndex("price"));
                Log.d("SQLiteActivity","book name is"+name);
                Log.d("SQLiteActivity","book author is"+author);
                Log.d("SQLiteActivity","book pages is"+pages);
                Log.d("SQLiteActivity","book price is"+price);
            }while (cursor.moveToNext());
        }
        cursor.close();//关闭数据库连接
        /**
         * 这里SQLiteDatabase提供了查询数据的方法,相对增删改要难,
         * query(String table,String[] columns,String selection,
        * String[] selectionArgs,String groupBy,String having,
        * String orderBy,String limit);
        * table:表名,columns:表中字段数据,selection:条件字句,
         * 相对于where字句,selectionArgs:条件字句数组对应的值,
         * groupBy:分组字段,having:分组条件,orderBy:排序,
         * limit:分页查询限制。
         * Cursor:返回结果集,相对于JDBC中的ResultSet.
        * Cursor是一种游标,类似于移动指针,常用方法如下:
         * getCount()获取总数据条数
         * moveToFirst()移动到第一条数据的位置
         * moveToLast()移动到最后一条数据的位置
         * moveToNext()移动到下一条数据位置
         * moveToPrecious()移动到上一条数据位置
         * isFirst()判断是否为第一条数据
         * isLast()判断是否为最后一条数据
         * move(int offset)移动到指定的数据位置
         * getXXX获取相应的数据类型值
         * */
    }
});

      怎么看都有些复杂,确实是比SQL语句难一些,安卓系统也是支持SQL语句的,大家最好两个都掌握哈!

 

 

 

 

Android数据库操作详解:使用SQLite进行数据存储 我们首先创建了数据库和数据表,然后演示了插入、查询、更新和删除数据的代码示例。通过合理运用这些数据库操作,我们可以实现数据的持久化存储和管理,为Android应用提供强大的数据支持。以下是一个示例代码,展示了如何创建一个名为"mydatabase.db"的数据库,并在其中创建一个名为"mytable"的数据表。上述代码中,我们首先获取可读的数据库实例,并定义了要查询的列名。上述代码中,我们首先获取可写的数据库实例,并创建一个。上述代码中,我们首先获取可写的数据库实例,并创建一个。在上述代码中,我们在。 阅读详情

相关推荐

Ubuntu20.04下Intel RealSense D435i相机驱动配置全攻略(含ROS Noetic适配)

本文详细介绍了在Ubuntu20.04系统下配置Intel RealSense D435i相机驱动的完整流程,包括libRealsense SDK 2.0安装、ROS Noetic适配及常见问题解决方案。通过实战指南帮助开发者快速实现深度相机与ROS的集成,适用于机器人视觉和SLAM应用开发。

weixin_29281915的博客 512

Android数据存储方式之 SQLite

Android数据存储方式之 SQLite轻量级的数据库 主要特点包括: 轻量级:一个动态库 、单个文件。 独立性: 没有依赖、无需安装。 隔离性: 全部在一个文件夹中。 跨平台: 支持众多操作系统。 多语言接口: 支持众多编程语言。 安全性: 事务处理。 关于事务处理的安全性问题。 -通过数据库的独占性和共享锁来实现独立事务处理。 -多个线程可以在同一事件从同一数据库读取数据,但只有

wangpai_yonghu的博客 491

Full Range && Limit Range

Full Range && Limit Range1 Full range和Limit Range定义2 为什么会需要Limit Range3 用Full range去显示limit Range图片4 YUV转RGB5 额外 1 Full range和Limit Range定义 我们知道,对于RGB和YUV的色彩空间来说,有个位深(bit-depth)的概念;位深是指记录图像每个像素的色彩通道时所使用的bit数,常见的RGB888,YUV420-8bit。以RGB888为例,其代表R G B

zjhcj1的博客 1万+

Android中SQLite数据库介绍

SQLite简介 更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boot 实战(干货) React 入门实战(干货) 构建中小型互联网企业架构(干货) python 学习持续更新 ElasticSearch 笔记 kafka storm 实战 ...

架构师的成长之路的博客 6466

银河麒麟v10装Docker实战:在线离线安装与容器部署指南

容器技术作为现代软件交付的核心方式,通过将应用与依赖打包成镜像,实现了环境的一致性与快速部署。Docker作为最流行的容器引擎,其安装与配置是上云和国产化转型中的基础技能。在国产操作系统银河麒麟v10环境中,由于系统兼容性和网络环境的差异,Docker的部署需要特别注意在线与离线两种模式的选择。本文从基础概念出发,结合麒麟v10的实际环境,详细梳理了Docker引擎的安装、镜像加速、存储配置以及MySQL、Redis等常用容器的部署方法,并针对SELinux、cgroup驱动等常见问题给出了解决方案,帮助开

weixin_30431445的博客 145

CANoe SOME/IP实战:从ARXML到VCODM的完整配置与调试

本文详细介绍了使用CANoe进行SOME/IP通信测试的完整流程,从硬件环境准备、ARXML文件处理到VCODM文件配置与调试。通过实战技巧和常见问题解决方案,帮助工程师高效完成从ARXML到VCODM的配置,确保SOME/IP通信的稳定性和可靠性。

weixin_29169899的博客 465

android属于数据库管理系统,详细谈谈Android系统中的SQLite数据库的应用

数据库是按照数据结构来组织、存储和管理数据的仓库,而在信息话的社会,数据库又不单单仅限与数据的相关内容,现在数据库技术是管理信息系统、办公自动化系统、决策支持系统等各类信息系统的核心部分,而SQL是结构化查询语言,是专为数据库而建立的操作命令集,SQLitr数据库是已过期嵌入式且实现零配置、无服务端和失误功能的SQL数据引擎,安全性比较好。那么现在我们来谈谈Android系统中的SQLite数据库...

weixin_35462903的博客 2076

2026 最新实战教程:AI 重构开发全流程(从需求→上线→运维)

1)做什么系统2)技术栈3)功能模块4)部署要求plaintext我要做一个:待办事项(Todo)全栈应用技术栈:前端:React + TypeScript + Tailwind后端:Node.js + Express + MongoDB部署:Docker + 本地运行(后续可上云)功能:- 增删改查任务- 任务状态切换(完成/未完成)- 简单错误处理请按企业级标准生成:架构设计 + 全部代码 + 接口文档 + 启动命令。

qq_35779316的博客 1684

Android中SQLite数据库介绍和使用

转载请注明出处: SQLite简介        上一篇博文我们学习了Android几种简单的数据存储方式,SharedPreference存储和文件存储(其中又分为外部设备文件存储和内部设备文件存储),这些数据存储方式可以满足我们日常开发中存储少量数据的需求。那么,如果使用它们存储一些数据量较大并且逻辑关系较为复杂的数据集,它们便显得较为笨拙和效率低下。那有没有更好的存储方案来解决此

叶功恒的博客专栏 1万+

用Cloudflare Worker搭建你的私人Gemini Pro API

文章介绍如何通过开源项目gemini-cli-openai将谷歌Gemini模型转换为兼容OpenAI API的服务,解决Gemini CLI的三大使用障碍:网络访问、命令行操作和生态整合问题。部署流程主要包括获取Google OAuth2凭证、配置Cloudflare Worker项目并设置KV存储,最终可在CherryStudio等图形客户端中调用Gemini。该方法利用Cloudflare全球网络实现加速访问,同时保持认证信息安全可控。

Hsiao的二进制生活 1681

学习记录(十一)--Pattern Recognition投稿记录

上一周特别忽然通知统计建模要答辩,确定是否晋级国赛,一直在准备答辩的事情,所以上一周没有总结周汇报,深刻检讨!!!不过结果是好的,我们组第二名晋级哦。这周主要是跟大家分享一下我投稿PR(Pattern Recognition)的一个时间线,以及投稿后的工作。一、PR从投稿到接收的时间线2025.4.3 Major Revision(ddl4.23) 当时正在弄比赛和另一个着急推进的文章2025.5.30 Minor Revision 这次小修基本上只有一些格式和简单一点点问题。

qq_54949944的博客 1917

Android的嵌入式关系型SQLite数据库使用

除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据。 在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以

1942

ABB机器人刷功能选项全一篇就够——不怕丢失程序和IO配置数据

ABB机器人刷功能选项

m0_66701835的博客 1258

安卓 sqlite数据存入mysql_详解Android数据存储—使用SQLite数据库

SQLite是Android自带的关系型数据库,是一个基于文件的轻量级数据库。Android提供了3种操作数据的方式,SharedPreference(共享首选项)、文件存储以及SQLite数据库。SQLite数据库文件被保存在/data/data/package_name/databases目录下。一、创建和删除表1.创建表创建表的SQL语句为:CREATE TABLE userInfo_bri...

weixin_42340136的博客 623

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android数据存储、文件存储、SQLite数据库简单使用、 sharedPreferences存储(五)

文章目录5 数据存储5.1 数据的存储方式5.2 文件存储5.2.1 将数据存入文件中5.2.2 从文件中读取数据5.2.3 实战演练-保存QQ账号和密码5.3 sharedPreferences存储5.3.1 将数据存入SharedPreferences中5.3.2 读取和删除数据5.3.3 实战演练—保存QQ账号和密码5.4 SQlite数据库存储5.4.1 SQLite数据库的创建5.4.2 SQLite数据库的基本操作5.4.3 使用sql语句进行数据操作5.4.4 SQLite数据库中的事务5.4

www?的博客 6668

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

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

Android的数据库SQLite进行数据存储与SharePreferences存储

Android的数据库SQLite进行数据存储与SharePreferences存储

徐大大的博客 4774

安卓 sqlite数据存入mysql_Android数据存储——SQLite数据库存储

一 创建数据库1.创建一个 “数据库管理器” 实体类来继承 SQLiteOpenHelper抽象类。其中需要重写两个方法用于创建数据库和升级数据库:onCreate()和onUpgrade()。2.数据库管理器的构造方法接收四个参数。第一个是context(环境),第二个是数据库名,第三个是查询数据返回的自定义的cursor、一般都是null,第四个是数据库的版本号。3.数据库管理器实例的两种方法...

weixin_42102401的博客 428

Android数据存储 如何搞定SQLite Database

在Android平台下有各种不同方法可以实现应用程序数据的存储和管理(SharedPerferences,File,SQLiteDatabase,网络存储),方法的选择依赖于需要存储的数据类型和数据结构。SQLite数据库能够安全而有效地解决结构化数据的存储问题; 这里主要介绍SQLite相关的用法,以及对数据库常见操作的封装。

CatTalk 4688

安卓数据存储宝典:SharedPreferences、SQLite 数据库、文件系统

在安卓应用开发中,数据存储是至关重要的环节,它决定了应用如何保存用户数据、设置和状态。SharedPreferences 是一个轻量级的键值对存储方案,适合存储简单的配置数据、用户偏好设置等。文件系统是安卓提供的一种通用存储机制,可以存储各种类型的数据,包括文本、图片、音频等。SQLite 数据库是嵌入式数据库,适用于存储结构化数据,如用户信息、交易记录等。希望本教程能帮助你深入了解安卓数据存储方式,并选择最合适的方案来满足你的应用需求。,并提供丰富实例和代码,助力你掌握数据存储技巧。

u011464172的专栏 1264

【Android】数据存储方案——文件存储、SharedPreferences、SQLite数据库用法总结

今天来介绍一下Android的数据持久化技术,提供了三种存储方式,还可以存储到SD卡中。适用于存储较大或复杂的数据文件,比如图像、视频、文档等。也适合存储简单的文本文件。适用于存储简单的键值对数据,比如用户设置和应用配置。数据量通常较小,数据结构简单。适用于存储结构化数据,支持复杂的查询和数据管理。

Patrick_yuxuan的博客 1643

Android数据存储之使用SQLite数据库存储数据

Android数据存储之使用SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保

waxx716的专栏 981

Android中数据存储——SQLite数据库存储数据

当一个应用程序在Android中安装后,我们在使用应用的过程中会产生很多的数据,应用都有自己的数据,那么我们应该如何存储数据呢?数据存储方式Android 的数据存储有5种方式: SharedPreferences存储数据    SharedPreferences数据存储,也叫作xml存储。这是将数据存储“data/data/程序包名/share_prefs”路径下的到xml文件中。 相关连接:

To_be_Designer 7628

Android基础之十五数据存储 之 SQLite数据库的封装

SQLite数据库的封装 一:建立实体类对象,字段名一定要和数据库里的一一对应 Book.java package com.example.entity; public class Book { private Integer id; private String author; private double price; private Integer

zhupengqq的博客 921

Android简单使用SharedPreferences和 SQLite数据库实现数据存储

在安卓app中,我们希望之前设置的一些信息能够保存在手机中,这样下次打开app时就能直接显示我们上次保存的信息,此时使用SharedPreferences来存储key-value形式的数据,它是Android提供的一个轻量级的存储类,非常适合用来存储app的各项参数。 使用方法: 登录页面输入用户名和密码后,使用SharedPreferences保存数据,并设置登录状态为1(已登录) pack...

codecho的博客 2723

【Android】-- 数据存储(一)(共享参数SharePreferences、数据库SQLite)

Android几种数据存储方式:共享参数SharePreferences、数据库SQLite、数据库管理器SQLiteDatabase、数据库帮助器SQLiteOpenHelper

个人博客 2343

【Android 数据存储】初见SQLite数据库

文章目录数据存储与访问之——初见SQLite数据库本节引言1.基本概念1)SQLite是什么?为什么要用SQLite?SQLite有什么特点?2)几个相关的类2.使用SQLiteOpenHelper类创建数据库与版本管理3.如何查看我们生成的db文件方法1:使用SQLite图形化工具查看db文件方法2:adb shell命令行带你装逼带你飞4.使用Android提供的API操作SQLite5.使用SQL语句操作数据库1.插入数据2.删除数据3.修改数据4.查询数据5.数据分页6.查询记录数 数据存储与访.

懂得一千零一种,赋予你失败的方法! 774
上一篇: Android数据存储之SharedPreferences存储
下一篇: Android四大组件之ContentResolver
小红妹
博客等级 码龄10年 151粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值