- 浏览: 162232 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
java菜鸟浩浩:
public class MainActivitytwo ex ...
Android GestureDetector方法详解 -
qq36246172:
Android GestureDetector方法详解 -
SilEnt怪兽:
我想打开 docx文件 可是 没有 ".docx&q ...
Android中调用系统所装的软件打开文件 -
Satur6ay:
最后注意中的第二点的意思是在Activity中的onTouch ...
Android GestureDetector方法详解 -
supperman:
在View中设置手势有两点需要注意:1:View必须设置lon ...
Android GestureDetector方法详解
一、基础知识
在Android平台上,集成了一个嵌入式关系型数据库——SQLite。SQLite第一个Alpha版本诞生于2000年5月。它是遵守ACID的关联式数据库管理系统,包含在一个相对小的C库中,同时是D.RichardHipp建立的公有领域项目。SQLite官方网站: http://www.sqlite.org/;SQLite中文社区:http://www.sqlite.com.cn/。
SQLite3支持NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上SQLite3也接受varchar(n)、char(n)、decimal(p,s)等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在INTEGER类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数,当向这种字段保存除整数以外的数据时,将会产生错误。 另外,SQLite在解析CREATE TABLE语句时,会忽略CREATE TABLE语句中跟在字段名后面的数据类型信息,如下面语句中会忽略name字段的类型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))即使指定了字段的数据长度,该字段仍然可以保存超过指定长度的内容。
SQLite可以解析大部分标准SQL语句,如:
查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
如:select * from person
select * from person order by id desc
select name from person group by name having count(*)>1
分页SQL与MySQL类似,下面SQL语句获取5条记录,跳过前面3条记录
select * from person limit 5 offset 3 或者 select * from person limit 3,5
插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values('孙小圣',3)
更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=' 孙小圣' where id=10
删除语句:delete from 表名 where 条件子句。如:delete from person where id=10
二、操作数据库
在Android系统里为我们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版本进行管理。为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如果你愿意,设置为100也行),并且在onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。
SQLiteOpenHelper类的getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
①:编写实现SQLiteOpenHelper类的子类DBOpenHelper
必须显式调用父类的构造方法:super(context, DATABASE_NAME, null, DATABASE_VERSION);
参数2是数据库名称,例如"sxs",可以没有后缀名,也可以有,例如" sxs.db"。
参数3是游标工厂,可以设为null使用默认的游标工厂。
参数4是版本号,例如是"1"。
数据库的位置:/data/data/<package_name>/databases/ sxs.db
②:创建数据库表
在onCreate(SQLiteDatabase db)方法中添加如下代码:
db.execSQL("create table person(personid integer primary key autoincrement, name varchar(20))");
SQLiteDatabase sQLiteDatabase = DBOpenHelper.getWritableDatabase();//第一次调用该方法就会创建数据库
第一次调用getWritableDatabase()或getReadableDatabase()方法后,SQLiteOpenHelper会缓存当前的SQLiteDatabase实例,SQLiteDatabase实例正常情况下会维持数据库的打开状态,所以你不再需要SQLiteDatabase实例时,请及时调用close()方法释放资源。一旦SQLiteDatabase实例被缓存,多次调用getWritableDatabase()或getReadableDatabase()方法得到的都是同一实例。
③:通过SQLiteDatabase进行增删改查。CRUD是指增加(Create)、查询(Retrieve)(重新得到数据)、更新(Update)和删除(Delete)几个单词的首字母简写。
第一种方式:SQLiteDatabase.execSQL(" ")、rawQuery(" ");
execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句;rawQuery()方法用于执行select语句。rawQuery()方法的第一个参数为select语句,第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,第二个参数设置为null。rawQuery()方法返回Cursor对象,Cursor是结果集游标,用于对结果集进行随机访问,Cursor与JDBC中的ResultSet作用很相似。使用moveToNext()方法可以将游标从当前行移动到下一行,如果已经移过了结果集的最后一行,返回结果为false,否则为true。另外Cursor还有常用的moveToPrevious()方法(用于将游标从当前行移动到上一行,如果已经移过了结果集的第一行,返回值为false,否则为true )、moveToFirst()方法(用于将游标移动到结果集的第一行,如果结果集为空,返回值为false,否则为true )和moveToLast()方法(用于将游标移动到结果集的最后一行,如果结果集为空,返回值为false,否则为true )。
第二种方式:SQLiteDatabase.insert(" ")、delete(" ")、update(" ")和query(" ");
各个字段的数据使用ContentValues进行存放。ContentValues类似于MAP,它提供了存取数据对应的put(String key, Xxx value)和getAsXxx(String key)方法, key为字段名称,value为字段值,Xxx指的是各种常用的数据类型,如:String、Integer等。
三、关于SQLite数据库中的事务操作
使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction()方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful()方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful()方法则回滚事务。使用例子如下:
SQLiteDatabase db = ....; db.beginTransaction();//开始事务 try { db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"张三", 5}); db.execSQL("update person set name=? where personid=?", new Object[]{"李四", 1}); db.setTransactionSuccessful();//调用此方法会在执行到endTransaction()时提交当前事务,如果不调用此方法则回滚事务。 } finally { db.endTransaction();//结束事务。由事务的标志决定是提交事务,还是回滚事务 } db.close();
上面两条SQL语句在同一个事务中执行。
四、列表显示数据
ListView由多个Item组成,Item可以自定义。每个Item由ImageView(图片)和TextView(文本)组成。
首先定义Item显示界面。
item.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:layout_width="80dip" android:layout_height="wrap_content" //android:text="1" android:id="@+id/id" /> <TextView android:layout_width="100dip" android:layout_height="wrap_content" //android:text="lisi" android:id="@+id/name" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" //android:text="22" android:id="@+id/age" /> </LinearLayout>
其次定义主界面。
main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="添加数据" android:id="@+id/insertbutton" /> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:layout_width="80dip" android:layout_height="wrap_content" android:text="ID" /> <TextView android:layout_width="100dip" android:layout_height="wrap_content" android:text="姓名" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="年龄" /> </LinearLayout> <ListView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/listView" /> </LinearLayout>
然后把数据绑定到ListView中,并为Item指定界面。
//可以使用SimpleAdapter List<Person> persons = personService.selectByPage(0, 5); //创建Map对象 List<Map<String, Object>> data = new ArrayList<Map<String,Object>>(); for(Person person : persons){ Map<String, Object> item = new HashMap<String, Object>(); item.put("id", person.getId()); item.put("name", person.getName()); item.put("age", person.getAge()); data.add(item); } ListView listView = (ListView) this.findViewById(R.id.listView); SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.item, new String[]{"id", "name", "age"}, new int[]{R.id.id, R.id.name, R.id.age}); listView.setAdapter(adapter); listView.setOnItemClickListener(new OnItemClickListener(){ public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //parent:当前点击的ListView对象 //view:当前点击的条目所绑定的view //position:绑定数据的位置 //id:view在ListView中的id ListView aListView = (ListView) parent; Map<String, Object> item = (Map<String, Object>) aListView.getItemAtPosition(position); Toast.makeText(MainActivity.this, item.get("id").toString(), 1).show(); } }); //也可以使用SimpleCursorAdapter /*ListView listView = (ListView) this.findViewById(R.id.listView); Cursor cursor = personService.selectCursorByPage(0, 5); SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.item, cursor, new String[]{"_id", "name", "age"}, new int[]{R.id.id, R.id.name, R.id.age}); listView.setAdapter(adapter); listView.setOnItemClickListener(new OnItemClickListener(){ public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //parent:当前点击的ListView对象 //view:当前点击的条目所绑定的view //position:绑定数据的位置 //id:view在ListView中的id ListView aListView = (ListView) parent; Cursor item = (Cursor) aListView.getItemAtPosition(position); int personid = item.getInt(item.getColumnIndex("_id")); Toast.makeText(MainActivity.this, personid + "", 1).show(); } });*/
当使用SimpleCursorAdapter时,可能会出现以下异常信息:
SimpleCursorAdapter:ERROR/AndroidRuntime(344): Caused by: java.lang.IllegalArgumentException: column '_id' does not exist。
如何解决上述异常?
方法1:创建表时直接定义表的主键列名为"_id"。
方法2:在查询时为表的主键指定别名为"_id"。
发表评论
-
android 截屏
2016-07-20 15:26 0View contentView = mView.findV ... -
ImageView的scaleType属性
2016-03-29 16:12 1153ImageView的scaleType属性中各个值的含 ... -
启动多个名字相同的Service
2013-06-18 10:48 2532如果想在多个App中启动JAR包中相同的Service可以在 ... -
Android GestureDetector方法详解
2013-02-04 11:00 20884为了加强点击、 ... -
Android开机自启动
2012-09-27 11:35 1204android中的开机自启动 and ... -
Android中的Menu点滴记录
2012-09-26 17:14 8341菜单是许多应用程序不可或缺的一部分,Andr ... -
Android中的SharedPreferences
2012-08-28 13:53 3524对于软件配置参数的保存,如果是windows软件通常我们会 ... -
android中popupwindow的点滴
2012-04-17 16:10 11876java类: package com.tony.Po ... -
Android AsyncTas开发
2012-03-12 21:27 1331Android的AsyncTask比Handl ... -
requestWindowFeature()的应用
2012-01-12 12:17 2168我们在开发程序是经常会需要软件全屏显示、自定义标题(使用 ... -
Android Service 优先级
2012-01-12 10:51 2470Android 系统对于内存管理有自己的一套方法,为了保障系 ... -
Android中解析JSON(一)
2011-12-30 10:55 3999什么是JSON? 1.JSON:Javascript ... -
EditText的属性
2011-12-14 14:51 1192本文主要研究一下EditText的属性 and ... -
Android中的消息通知(NotificationManager和Notification)
2011-11-22 18:05 40622下面来谈谈notification,这个notif ... -
Android中调用系统所装的软件打开文件
2011-11-18 15:07 8790在应用中如何调用系统所装的软件打开一个文件,这是我们经常碰到的 ... -
Android中的程序安装和卸载
2011-11-18 14:05 1137在Android应用开发中我们经常会用到程序的安装和卸载,比如 ... -
Android动画开发之Animation动画效果
2011-11-16 16:39 1254动画类型 Android的animati ... -
Android横竖屏切换
2011-11-16 11:35 1620Android横竖屏要解决的问 ... -
OnScrollListener回调分析
2011-11-09 17:06 1304OnScrollListener回调分析 如果adap ...
相关推荐
sqlite数据库可视化工具,用于实时操作,增删改查等等
6. **数据存储**:Android提供了多种数据存储方式,包括SQLite数据库、SharedPreferences、内部/外部存储以及ContentProvider等。开发者应根据需求选择合适的数据持久化方案。 7. **网络编程**:Android支持HTTP和...
SQLite数据库损坏恢复实践 对话交互-从开端到成长 利用CNN实现无需联网的图像识别 使用TensorFlow搭建智能开发系统,自动生成App UI代码 android客户端Walle框架演进与实践之路 反作弊技术架构与设计 共享代码衍生...
一开始图省事儿,我用的sqlite3当后端数据库,但单位要求在项目正式上线的时候用SQL Server,于是,记得django 1.9默认不支持微软那一套的我,就开始在网上搜啊搜,现是发现有人说只要装好一个名为pymssql的包,于是...
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
《基于YOLOv8的智慧社区独居老人生命体征监测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
Android Studio Meerkat 2024.3.1 Patch 1(android-studio-2024.3.1.14-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/90557060 part2: https://download.csdn.net/download/weixin_43800734/90557056
侧轴承杯加工工艺编制及夹具设计.zip
NASA数据集锂电池容量特征提取(Matlab完整源码和数据) 作者介绍:机器学习之心,博客专家认证,机器学习领域创作者,2023博客之星TOP50,主做机器学习和深度学习时序、回归、分类、聚类和降维等程序设计和案例分析,文章底部有博主联系方式。从事Matlab、Python算法仿真工作8年,更多仿真源码、数据集定制私信。
板料折弯机液压系统设计.zip
C6150车床的设计.zip
机器学习之KNN实现手写数字
python爬虫;智能切换策略,反爬检测机制
mpls-vpn-optionA-all
56tgyhujikolp[
GB 6442-86企业职工伤亡事故调查分析规则.pdf
汽车液压式主动悬架系统的设计().zip
2000-2024年各省专利侵权案件结案数数据 1、时间:2000-2024年 2、来源:国家知识产权J 3、指标:专利侵权案件结案数 4、范围:31省 5、用途:可用于衡量知识产权保护水平
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
内容概要:本文档详细复现了金融数学课程作业,涵盖欧式看涨期权定价和投资组合优化两大部分。对于欧式看涨期权定价,分别采用Black-Scholes模型和蒙特卡洛方法进行了计算,并对彩虹期权进行了基于最大值的看涨期权定价。投资组合优化部分则探讨了最小方差组合、给定收益的最小方差组合、最大效用组合以及给定风险的最大收益组合四种情形,还对比了拉格朗日乘数法和二次规划求解器两种方法。文中不仅提供了详细的MATLAB代码,还有详尽的中文解释,确保每一步骤清晰明了。 适合人群:金融工程专业学生、量化分析师、金融数学爱好者。 使用场景及目标:①帮助学生理解和掌握金融衍生品定价的基本原理和方法;②为从事量化分析的专业人士提供实用工具和技术支持;③作为教学材料辅助高校教师讲授相关内容。 其他说明:文档还包括了完整的论文结构建议,从封面页到结论,再到附录,涵盖了所有必要元素,确保提交的作业符合学术规范。此外,还特别强调了数据预处理步骤,确保代码可以顺利运行。