Android数据存取之Databases

Android 高手进阶教程(二)之----Android 数据库SQLiteDatabase的使用!! 有两种方法:第一种用命令查看:adb shell ls data/data/com.android.tutor/databases。可以存取简单的数据(int,double,float.etc),它经常用于数据缓存,因为它读取存储简单。第一步:新建一个Android工程,命名为SQLiteDatabaseDemo.2.Android Framework学习指南,助力成为系统级开发高手。5.Android Jetpack从入门到精通,构建高质量UI界面。10.Android零基础入门到精通,高手进阶之路。 阅读详情

在Android平台上可以操作数据库,这是第一次接触Android时的惊艳之一。在Android平台上,绑定了SQLite数据库,这个数据库系统也是极具性格的,它的最大的应用场景是嵌入式系统,进一步了解可以参看这里。

如果有JDBC的经验,那么在这里会容易的多。Android中操作数据库首先要通过一个类:android.database.sqlite.SQLiteOpenHelper。它封装了如何打开一个数据库,其中当然也包含如果数据库不存在就创建这样的逻辑。看一个例子:
view plaincopy to clipboardprint?

pubilc class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "com.roiding.simple.note";
private static final int DATABASE_VERSION = 1;
private static final String NOTES_TABLE_NAME = "notes";

DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + NOTES_TABLE_NAME
+ " (id integer primary key autoincrement, name text);");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS notes");
onCreate(db);
}
}

这里面,如下的语句需要解释:

    * super(context, DATABASE_NAME, null, DATABASE_VERSION)
      数据库连接的初始化,中间的那个null,是一个CursorFactory参数,没有仔细研究这个参数,暂时置空吧。
    * public void onCreate(SQLiteDatabase db)
      这里面的onCreate是指数据库onCreate时,而不是DatabaseHelper的onCreate。也就是说,如果已经指定 database已经存在,那么在重新运行程序的时候,就不会执行这个方法了。要不然,岂不是每次重新启动程序都要重新创建一次数据库了!在这个方法中,完成了数据库的创建工作。也就是那个execSQL()方法。
    * public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
      在程序的开发维护过程中,数据库的结构可能会有变化,那么这个方法就有用处了。在DatabaseHelper这个对象一创建时,就已经把参数 DATABASE_VERSION传入,这样,如果Android发现此版本与现有版本不一致,就会调用这个onUpgrate方法。于是,可以在这里面实现一些数据的upgrade工作,比如说创建一个临时表,将数据由临时表中转到新的表结构中。需要注意的是,这里面的onUpgrade是在版本不一致时调用,也就是说不管当前需要的版本高于现有版本还是低于现有版本,都会出发这个方法,类似的这种情况,就需要对oldVersion和 newVersion进行判断之后再决定使用什么策略来更新数据。

在Android中,数据库存放在 /data/data/PACKAGE_NAME/databases 目录下。

接下来就可以使用这个Helper来操作数据库了,操作数据库也就无非是增、删、改、查。先看一个增的例子:
view plaincopy to clipboardprint?
public static void insert(Context context, String s) {
DatabaseHelper mOpenHelper = new DatabaseHelper(context);

String table = "notes";
String nullColumnHack = "id";

ContentValues values = new ContentValues();
values.put("name", "www.roiding.com");

long id = mOpenHelper.getReadableDatabase().insert(table,
nullColumnHack, values);

mOpenHelper.getReadableDatabase().close();
}

    * DatabaseHelper mOpenHelper = new DatabaseHelper(context);
      如果和JDBC例子的话,这一步貌似就像是获得了一个Statement,用它就可以操作数据库了。
    * ContentValues values = new ContentValues();
      Android在向数据库中插入数据的时候,要求数据存放到ContentValues中,这里面的ContentValues其实就是一个 Map,Key值是字段名称,Value值是字段的值。这样,也许你会发现一个问题,那数据类型怎么办?其实在SQLite数据库中就是没有数据类型的,一切都是字符串。
    * mOpenHelper.getReadableDatabase().insert(table,nullColumnHack, values);
      将数据入库,注意这里面有一个nullColumnHack,看文档是和所有字段都是空的记录有关系,我没有去实验他具体的效果,只是随便给他一个字段名称。

再看一个查的例子:
view plaincopy to clipboardprint?
public static void select(Context context) {
DatabaseHelper mOpenHelper = new DatabaseHelper(context);

String table = "notes";
String[] columns = new String[] { "id", "name" };
String selection = "id>? and name<>?";
String[] selectionArgs = new String[] { "0", "roiding.com" };
String groupBy = null;
String having = null;
String orderBy = "id desc";
String limit = "1";

Cursor c = mOpenHelper.getReadableDatabase().query(table,
columns, selection, selectionArgs, groupBy, having, orderBy, limit);

c.moveToFirst();
for (int i = 0; i < c.getCount(); i++) {
String s = c.getString(1);
c.moveToNext();
}
c.close();
mOpenHelper.getReadableDatabase().close();
}

    * DatabaseHelper mOpenHelper = new DatabaseHelper(context);
      于前文中的相同
    * mOpenHelper.getReadableDatabase().query();
      通过mOpenHelper.getReadableDatabase(),会得到一个SQLiteDatabase类型的只读的数据库连接,在这里直接调用了他的query方法。这个query方法相对复杂,因为他将一个完整的SQL语句拆成了若干个部分:
          o table:表名。相当于SQL的from后面的部分。那如果是多表联合查询怎么办?那就用逗号将两个表名分开,拼成一个字符串作为table的值。
          o columns:要查询出来的列名。相当于SQL的select后面的部分。
          o selection:查询条件,相当于SQL的where后面的部分,在这个语句中允许使用“?”,也就是说这个用法和JDBC中的PreparedStatement的用法相似。
          o selectionArgs:对应于selection的值,selection有几个问号,这里就得用几个值。两者必须一致,否则就会有异常。
          o groupBy:相当于SQL的group by后面的部分
          o having:相当于SQL的having后面的部分
          o orderBy:相当于SQL的order by后面的部分,如果是倒序,或者是联合排序,可以写成类似这样:String orderBy = “id desc, name”;
          o limit:指定结果集的大小,它和Mysql的limit用法不太一样,mysql可以指定从多少行开始之后取多少条,例如“limit 100,10”,但是这里只支持一个数值。
    * c.moveToFirst();
      这一句也比较重要,如果读取数据之前,没有这一句,会有异常。
    * c.getString(1);
      与JDBC一致了,Android不支持按字段名来取值,只能用序号。

再看一个删除和修改的例子:
view plaincopy to clipboardprint?

public static void delete(Context context) {
DatabaseHelper mOpenHelper = new DatabaseHelper(context);

String table = "notes";
String selection = "id>? and name<>?";
String[] selectionArgs = new String[] { "0", "roiding.com" };
String whereClause = selection;
String[] whereArgs = selectionArgs;

mOpenHelper.getWritableDatabase().delete(table, whereClause, whereArgs);
mOpenHelper.getWritableDatabase().close();
}

有了上面的基础这里就容易理解了,这里的whereClause相当于前面的selection,whereArgs相当于前面的selectionArgs。
view plaincopy to clipboardprint?

public static void update(Context context) {
DatabaseHelper mOpenHelper = new DatabaseHelper(context);

String table = "notes";
String selection = "id>? and name<>?";
String[] selectionArgs = new String[] { "0", "roiding.com" };
String whereClause = selection;
String[] whereArgs = selectionArgs;

ContentValues values = new ContentValues();
values.put("name", "www.roiding.com");

mOpenHelper.getWritableDatabase().update(table, values,
whereClause, whereArgs);
mOpenHelper.getWritableDatabase().close();
}

这个update的用法,综合select和delete就可以理解。

注意:

    * Cursor和Databases要及时关闭,不然也会有异常。
    * getWritableDatabase()和getReadableDatabase()在当前的Android版本中貌似可以通用,像上面的insert,用的就是getReadableDatabase。

在真实的应用中,会对上面这些基本操作做更高一级的抽象和封装,使之更容易使用。在select时,除了用上述的方法,将分段的SQL语句传进去之外,Android还支持一种方法:使用SQLiteQueryBuilder。如果使用的是上述的分段SQL语句的方法,在Android的内部实现中,也是先将分段的SQL使用SQLiteQueryBuilder的静态方法来生成一个真正的SQL的,而且,我没有看出来使用 SQLiteQueryBuilder的优势。

微信聊天记录本地数据库加密原理与解密恢复实战指南 在移动应用数据安全领域,本地数据库加密是保护用户隐私的核心技术。SQLCipher作为SQLite的透明加密扩展,通过对整个数据库文件进行加密,实现了数据存储的安全加固。这项技术的价值在于,即使设备丢失或文件被非法访问,没有密钥也无法读取原始数据,有效保障了用户通信的私密性。在即时通讯、金融等涉及敏感信息的应用场景中,数据库加密已成为标准实践。然而,当用户因设备更换或误操作导致数据丢失时,如何合规地恢复这些加密数据就成为了一个技术挑战。本文以微信聊天记录恢复为例,深入解析其基于IMEI/UIN与MD5的密钥 阅读详情

相关推荐

Android数据存储—— SQL Database

对于一些结构非常明确的数据,或者是重复性比较高的数据,把它存储在数据库中是最好的选择。比方说是联系人,每一个联系人都会有姓名,手机号,电话,邮箱,住址等信息,当然可能会有一些字段存储的时候会是空的。对于每一个联系人来说,结构都是十分明确清晰的,这样,利用数据库来存储信息是比较合适,也是比较方便的。

1266

android中的数据库操作

android中的数据库操作       android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作。   一、android内的数据库的基础知识介绍          1.用了什么数据库             android中采用的数据库是SQLite这个轻量级的嵌入式开源数据库,它是用c语言构建的。相关简介可以从链接查看。

Winiex's Blog 18万+

Android存取Databases

Android存取Databases 在Android平台上,绑定了SQLite数据库,这个数据库系统也是极具性格的,它的最大的应用场景是嵌入式系统

关于Android中DatabaseHelper和Database的关系

(所以说onCreate方法中的create,指的既不是DatabaseHelper的创建,也不是表的创建,而是数据库的创建。想得到Database,需要首先得到一个DatabaseHelper的对象,得到的方法很简单,直接使用new就可以了,会自动调用DatabaseHelper的构造方法,构造方法传入的参数分别是 (Context,数据库名,一般为null的值,版本号),注意此时虽然传入了数据库名,但是并没有实际创建数据库。粗略画了一个uml图,可能不是很严谨。

woyouyitoulu的博客 1414

IEEE Transaction期刊模板使用注意事项

本文将总结使用IEEE Transactions系列期刊的投稿模板时的一些注意事项,包括模板本身的使用规范、参考文献的正确格式等其他内容。

weixin_39529207的博客 2万+

如何在项目中集成bpmn-process-designer

文章目录一、bpmn-process-designer是什么?二、使用步骤1.将下面地址的代码下载到本地2.替换dependencies和devDependencies3.拷贝package目录4.在main.js引入代码5.拷贝src5.拷贝App.vue代码注意事项 一、bpmn-process-designer是什么? bpmn-process-designer是一个基于 bpmn.js,Vue 2.x 和 ElementUI 开发的流程设计器(前端部分),支持监听器,扩展属性,表单等配置,可自由扩展

weixin_43550766的博客 9454

Android Studio功能 - Database Inspector 调试数据库

在Android 开发中数据库存储还是相对比较频繁的一个功能,`早之前我查看数据库的时候,大多使用的是DDMS工具类、Google插件、或是三方插件的方式`,我之前也实操后,记录过几篇,具体可看篇内~

Android、前端、小程序、后端 1万+

python怎样按某一列值拆分Excel表格

pd.ExcelWriter@python #用python按某一列拆分Excel工作表,将内容写入一个工作簿 本次以“按照表中的某一列,将一张表格拆分为多张表”的需求为例,简单介绍这个过程中用到的pd.ExcelWriter,及每一句的作用。 如上表《学生.xlsx》,假设有14万行28列,请按照学校名,拆分表格(不想用复制粘贴)。 ##代码及解释如下 import pandas as pd from time import time#用来计算时间,展示进度,减少焦虑 in_ws='学生.xlsx'#

learn_get的博客 6787

【Android studio】使用 Database Inspector 调试数据库【MyAndroid】

工欲善其事必先利其器 打造自己的屠龙匕首

产品:SmartApi;服务:大前端++;其他技术分享 6092

OSG三维渲染引擎编程学习之一:“第一章:OSG介绍” 之 “1.1 OSG简介”

第一章:OSG介绍; 1.1 OSG简介。

LuckyHanMo的博客 3223

6.8 点云相关软件——CoProcess

摘要 CoProcess是华测导航研发的三维点云全流程处理平台,支持海量数据浏览、编辑及多类型成果输出,适配地形测绘、道路建设等行业需求。软件采用模块化设计,包含基础功能(数据导入、分类、建模等)和行业定制模块(地形、道路、矿山等),支持多格式数据交互与自动化处理,显著提升作业效率。相比Lidar360,CoProcess操作更简便、性价比更高;相比开源工具CloudCompare,其行业适配性与专业功能更优。2025版本优化了数据处理性能与智能算法,需授权激活高级功能,适合商业项目应用。

qq625924821的博客 248

Android 数据存取之Databases

在Android平台上可以操作数据库,这是第一次接触Android时的惊艳之一。在Android平台上,绑定了SQLite数据库,这个数据库系统也是极具性格的,它的最大的应用场景是嵌入式系统,进一步了解可以参看这里。 如果有JDBC的经验,那么在这里会容易的多。Android中操作数据库首先要通过一个 类:android.database.sqlite.SQLiteOpenHelper。它...

yanlijun250 111

引入高分辨率特征层保持的YOLOv10小目标增强:从思路到完整实现

大概两个月前,我在做一个无人机航拍图像检测的项目,目标是识别图片里的小型车辆和行人。用的数据集是VisDrone,相信做小目标检测的朋友对这个数据集都不陌生。一开始我直接跑了官方YOLOv10的代码,结果在tiny vehicle这一类上mAP50只有可怜的0.312。那些小目标基本就是几个像素点,YOLOv10在三次下采样之后,这些小目标的特征几乎就消失不见了。 后来我折腾了大概三周,尝试了各种方法:改anchor、调loss权重、做数据增强、甚至考虑过换检测头。最后发现最有效的还是引入一个高分辨率特征

YOLO 50

安卓 SQLiteDatabase类

SQLiteDatabase类 实现数据库基本操作数据库创建的问题解决了,接下来就该使用数据库实现应用程序功能的时候了。基本的操作包括创建、读取、更新、删除,即我们通常说的CRUD(Create, Read, Update, Delete)。在实现这些操作的时候,我们会使用到两个比较重要的类SQLiteDatabase类和Cursor类。 SQLiteDatabase类在上面已经接...

weixin_30319153的博客 112

YOLO26改进 - C2PSA | C2PSA融合DiffAttention差分注意力:轻量级差分计算实现高效特征降噪,提升模型抗干扰能力

本文介绍了 DiffCLIP,一种将差分注意力机制集成到 CLIP 架构的视觉 - 语言模型,并将其应用于 YOLO26。差分注意力机制通过计算两个互补注意力分布的差值,抵消无关信息干扰。单头差分注意力将 Q 和 K 拆分,分别计算注意力分布后做差值融合;多头差分注意力则每个头独立执行差分操作后聚合输出。关键参数 λ 可动态调控噪声抵消强度。我们将 DiffAttention 代码集成到 YOLO26 中,替换原有模块。实验表明,改进后的 YOLO26 在图像 - 文本理解任务中表现出色。

魔改工程师的博客 602

小梅哥Xilinx ZYNQ学习笔记2——38译码器

译码器(Decoder)是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等),功能与编码器相反。译码器一般分为通用译码器和数字显示译码器两大类。本设计的是通用译码器。三八译码器,即是 3 种输入状态翻译成 8 种输出状态。1.case开始开始,endcase结束;2.数字声明时,合法的基数格式有 4 中,包括:十进制('d 或 'D),十六进制('h 或 'H),二进制('b 或 'B),八进制('o 或 'O)。数值可指明位宽,也可不指明位宽。

m0_51430584的博客 1636

android 读写文件 简书,Android 学习笔记之文件数据读写

Android 学习笔记之文件数据读写我们直接直接写文件时,可能会报出为read-only的异常。在Android中系统中,每一个应用就是一个用户,每个用户的权限时特定的,不允许操作其他用户的内容。基于Linux的Android,是以“/”为根目录,与Windows不一样。当我们把文件数据保存在此应用数据保存目录下(data/data/包名),我们即可保存数据。我们可以直接写全路径,也可以通过调用...

weixin_36034659的博客 155

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

android database

import android.content.Context;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sq...

ahaitongxue的专栏 706

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android-入门教程-内部存储-databases

使用 Room 将数据保存到本地数据库 | Android 开发者 | Android Developers

深度安全实验室 638

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

对于更加复杂的数据结构, android提供了内置的SQLite数据库来存储数据.SQLite使用SQL命 令提供了完整的关系型数据库能力,每个使用SQLite的应用程序都有一个该数据库的实例,并且在默认情况下公限当前应用使用,数据库存存储在android设置 的/data/data//databases文件夹中.

wenzhi的博客 1991

安卓开发:和数据操作相关的database,dao,repository代码

使用 Room Persistence Library 创建的数据库抽象表示。AppDatabase 继承自 RoomDatabase,用于管理数据库的创建和版本管理,以及提供数据访问对象(DAO)的访问点。

weixin_47505105的博客 1450

Android 数据库DataBase realm基础使用

前言: Android开发中,不可避免使用到数据库来记录必要数据,比如手机写教程存草稿,临时的标题、图片Uri、描述等写在数据库中,方便下次编辑,比如一些远程实时观测大数据,不能实时传送,需要搜集到设备中DataBase,后续通过服务保证上传完整性,或者一些离线操作app都需要大量的DataBase。 DataBase选取,GreenDao、realm等专门为移动端设计的数据库DataBase,至于性能各有优势,但是还是主流让我选择了realm,原因很简单,就是因为使用简单。 地址: realm官网

Beluga_白鲸 1080
上一篇: Android开发中保存数据的四种方法
下一篇: Android数据存取之Preferences
RuizeMa
博客等级 码龄18年 8粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值