Android读取mysql多条数据_Android中Sqlite数据库读写数据

Sqlite数据库作为一个轻量级数据库,可以较为方便地实现Android中诸如历史记录的储存等操作。本文首先介绍Sqlite数据库的创建与读写等数据库操作,而后完成使用界面的方式操作Sqlite数据库中的数据。

一、Sqlite数据库的数据读取与写入

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

1.创建

创建类继承自SQLiteOpenHelperpublic classDbextendsSQLiteOpenHelper {

添加构造函数,不需要的参数可以不写//构造函数,参数:name为数据库名称,Cursor用于逐行读取数据库结果,封装的查询结果,version为版本号

publicDb(Context context) {

super(context,"db", null,1);

}

重写数据库创建与升级方法//当应用中不存在数据库时创建

@Override

public voidonCreate(SQLiteDatabase db) {

//创建表,包含name,sex两列,文本类型,默认值为空  PRIMARY KEY AUTOINCREMENT主键自增

db.execSQL("CREATE TABLE user("+

"_id INTEGER PRIMARY KEY AUTOINCREMENT,"+

"name TEXT,"+

"sex TEXT)");

}//数据库升级,sql语句操作数据库,检查操作系统中的同名数据库版本号低则升级

@Override

public voidonUpgrade(SQLiteDatabase db, intoldVersion, intnewVersion) {

}

2.写入数据//实例化数据库对象

Db db =newDb(this);

//获取可写入数据库用于插入数据

SQLiteDatabase dbWrite = db.getWritableDatabase();

//使用ContentValues封装数据

ContentValues cv =newContentValues();

//输入对应的键值对的值

cv.put("name","bss");

cv.put("sex","男");

//插入数据,参数为表名,当列为空时的填充值,封装数据的ContentValue

dbWrite.insert("user",null,cv);

使用完成后关闭数据库//使用完之后关闭数据库

dbWrite.close();

3.读取数据

获取可读取数据库SQLiteDatabasedbRead = db.getReadableDatabase();

使用query()方法查询,返回值为CursorCursor c = dbRead.query("user",null,null,null,null,null,null);

query()的参数为:

参数:表名,查询的列,查询条件,条件参数,分组,分组条件,顺序

查询列的写法:

new String[]{"name"}

为防止sql注入攻击,查询条件与条件参数为:

"name =?",new String[]{"bss"

通过Cursor的moveToNext方法判断结果是否结束,通过getColumnIndex获取查询列的编号

通过getString获取编号下的值while(c.moveToNext()){

String name = c.getString(c.getColumnIndex("name"));

String sex = c.getString(c.getColumnIndex("sex”));

二、通过界面操作Sqlite数据库

将数据库查询结果呈现到ListView中

主布局中添加listView,声明SimpleCursorAdapter对象用于接收查询结果CursorprivateSimpleCursorAdapteradapter;

实例化数据库对象,获取可读写数据库对象db=newDb(this);

dbRead=db.getReadableDatabase();

dbWrite=db.getWritableDatabase();

实例化SimpleCursorAdapter对象,参数为//参数:context,显示结果的布局资源,Cursor,Cursor的需要输出的数据源,输出的位置,初次查询时cursor可以为空

adapter=newSimpleCursorAdapter(this,R.layout.user_list_cell

,null,newString[]{"name","sex"},new int[]{R.id.tvName,R.id.tvSex});

用于呈现结果的布局需要手动创建,线形布局,分别用大小文本呈现

大小文本的样式分别为:android:textAppearance="?android:textAppearanceLarge”/>

android:textAppearance="?android:textAppearanceMedium"/>

注意:SimpleCursorAdapter要求数据表中必须有_id这一列,且为自增主键,创建如下://创建表,包含name,sex两列,文本类型,默认值为空  PRIMARY KEY AUTOINCREMENT主键自增

db.execSQL("CREATE TABLE user("+

"_id INTEGER PRIMARY KEY AUTOINCREMENT,"+

"name TEXT DEFAULT\"\","+

"sex TEXT DEFAULT\"\")");

实例化ListView并为listview设置adapterlv= (ListView) findViewById(R.id.list);//只要adapter发生改变,setAdapter()函数就执行

lv.setAdapter(adapter);

设置刷新列表的函数,通过改变adapter的cursor从而改变adapter达到刷新列表的目的//更改adapter的Cursor,从而达到更新列表项

private voidrefershListview(){

Cursor c =dbRead.query("user",null,null,null,null,null,null);

adapter.changeCursor(c);

}

执行refershListView后,adapter改变,setAdapter自动执行,列表刷新

在button的onClick函数中,通过ContentValue存入数据,通过dbwriter将数据插入数据库

插入完成后刷新列表public voidonClick(View v) {

ContentValues cv =newContentValues();

cv.put("name",etName.getText().toString());

cv.put("sex",etSex.getText().toString());

dbWrite.insert("user",null,cv);

refershListview();

}

实现ListView长按删除item

为listView设置onItemLongClickListener,返回值改为true,提示系统此次为长按操作,可以继续执行后续操作lv.setOnItemLongClickListener(newAdapterView.OnItemLongClickListener() {

@Override

public booleanonItemLongClick(AdapterView parent,View view, final intposition, longid) {

//反馈操作系统此次是否为长按,true为长按,可触发震动等

return true;

通过AlertDialog创建对话框,设置title与message,通过积极按钮(positive Button)设置需要操作的button,铜过消极按钮(negative Button)设置不需要操作的button,positive button需要设置DialogInterface.onClickListener,negative button的事件监听器为null,通过show弹出对话框。newAlertDialog.Builder(MainActivity.this).setTitle("提醒").setMessage("你确定要删除该项吗?")

.setPositiveButton("确定", newDialogInterface.OnClickListener() {

通过adapter中的cursor移动到相应位置,通过dbWriter删除,删除后刷新列表

//通过adapter获取到Cursor,并移动到长按的位置

Cursor c =adapter.getCursor();

//内部类访问可变变量有问题

c.moveToPosition(position);

//获取数据库中这条数据的_id

intitemId = c.getInt(c.getColumnIndex("_id"));

//删除对应的数据,参数为表名,删除的条件,条件的结果

dbWrite.delete("user","_id=?",newString[]{itemId+""});

refershListview();

注意:数据库创建时的onCreate函数在没有数据库时才会创建,如需重新创建应先手动清除应用数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ef-orm A Simple OR-Mapping framework on multiple databases. 使用手册(文)http://geequery.github.io/ef-orm/manual/EF-ORM-user-guide.docx  使用示例工程 https://github.com/GeeQuery/ef-orm/tree/master/orm-tutorial EF-ORM是一个轻量,便捷的Java ORM框架。并且具备若干企业级的应用特性,如分库分表、JTA事务等。 代码生成插件for eclipse(请在eclipseHelp/Install new software后输入地址并安装)http://geequery.github.io/plugins/1.3.x/特点一 EF的设计的一个主要目的是提高开发效率,减少编码工作,让开发者“零配置”“少编码”的操作数据库大部分功能。 例如:数据库查询条件的传入问题是所有ORM框架都不能回避的一个问题,所以我经常在想——既然我们可以用向DAO传入一个Entity来实现插入操作,为什么就不能用同样的方法来描述一个不以主键为条件的update/select/delete操作?为什么DAO的接口参数老是变来变去?为什么很多应用,自行设计开发类来描述各种业务查询条件才能传入DAO?为什么我们不能在数据访问层上花费更少的时间和精力?   JPA1.0和早期的H框架,其思想是将关系型数据库抽象为对象池,这极大的限制了本来非常灵活的SQL语句的发挥空间。而本质上,当我们调用某H框架的session.get、session.load、session.delete时,我们是想传递一个以对象形式表达的数据库操作请求。只不过某H框架要求(并且限制)我们将其视作纯粹的“单个”对象而已。JPA 2.0为了弥补JPA1.0的不足,才将这种Query的思想引入为框架的另一套查询体系——Criteria API。事实上针对单个对象的get/load/persist/save/update/merge/saveOrUpdate API和Criteria API本来就为一体,只不过是历史的原因被人为割裂成为两套数据库操作API罢了。   因此,对于关系型数据库而言——Entity和Query是一体两面的事物,所谓Query,可以包含各种复杂的查询条件,甚至可以作为一个完整的SQL操作请求的描述。为此,EF彻底将Entity和Query绑在了一起。这种思想,使得—— 开发人员需要编写的类更少。开发人员无需编写其他类来描述复杂的SQL查询条件。也无需编写代码将这些查询条件转换为SQL/HQL/JPQL。DAO层也不会有老要改来改去的接口和API,几乎可以做到零编码。 对单个对象进行CRUD的操作API现在和Criteria API合并在一起。Session对象可以直接提供原本要Criteria API才能提供实现的功能。API大大简化。 IQueryableEntity允许你将一个实体直接变化为一个查询(Query),在很多时候可以用来完成复杂条件下的数据查询。比如 ‘in (?,?,?)’, ‘Between 1 and 10’之类的条件。 xxQL有着拼装语句可读性差、编译器无法检查、变更维护困难等问题,但是却广受开发人员欢迎。这多少有历史原因,也有Criteria API设计上过于复杂的因素。两者一方是极端灵活但维护困难,一方是严谨强大而学习和编写繁琐,两边都是极端。事实上JPA的几种数据查询方式存在青黄不接的问题。选择查询语言xxQL,项目面临后续维护困难,跨数据库移植性差;选择Criteria API,代码臃肿,操作繁琐,很多人望而却步。EF的设计思想是使人早日摆脱拼装SQL/HQL/JPQL的困扰,而是用(更精简易用的)Criteria API来操作数据库。 基于轻量级Criteria API的操作方式,使得对数据库的变更和重构变得非常轻松,解决了SQL语句多对软件维护和移植造成产生的不利影响。 阅读推荐:第3、4章 特点二,将SQL的使用发挥到极致,解决SQL拼凑问题、数据库移植问题 大部分OLTP应用系统到最后都不免要使用SQL/JPQL,然而没有一个很好的方法解决SQL在多种数据库下兼容性的问题。 EF-ORM采用了独特的SQL解析和改写技术,能够主动检查并确保SQL语句或者SQL片段在各个数据库上的兼容性。 EF除了Criteria API以外,可以直接使用“SQL语句”或者“SQL片段”。但是这些SQL语句并不是直接传送给JDBC驱动的,而是 有着一个数据库方言层,经过方言层处理的SQL语句,就具备了在当前数据库上正确操作的能力。这相当于提供了一种能跨数据库操作的SQL语言。(E-SQL) E-SQL不但解决了异构数据库的语法问题、函数问题、特殊的写法问题,还解决了动态SQL问题、绑定变量扩展等特性。 对于各种常用SQL函数和运算符,都可以自动转换为当前数据库支持的方言来操作。其函数支持也要多于HQL支持的函数。 阅读推荐:第7、8章 特点三,可能是业界最快的ORM框架. 得益于ASM的动态代码生成技术,部分耗时操作通过动态代码固化为硬编码实现,EF-ORM的大部分操作性能要超过已知的其他框架。 实际性能测试表明,EF的大部分操作都要快于Hiberante和MyBatis, 部分操作速度甚至数十倍于上述框架。 EF在极限插入模式下,甚至刷新了每秒10万条写入的记录。远远超过了其他框架。 一个初步的性能测试:测试代码:http://geequery.github.io/ef-orm/manual/performance-test.rar 测试报告:http://geequery.github.io/ef-orm/manual/performance-compare.docx 阅读推荐:第9、17章 特点四,分库分表 开发过程参照了Hibernate Shards、Alibaba TDDL、Cobar等框架,也是基于词法分析器来提取SQL参数,并计算路由。 能支持分库维度含糊等场景下的分库分表。以及包括多库多表下的 order by , distinct, group by, having等操作。 阅读推荐:第10章 特点五,常用DDL操作的封装 从数据库数据访问,到建表,创建约束,创建sequence等各种DDL操作进行了封装,用户无需编写各种SQL,可以直接通过API操作数据库结构。 尤其是ALTER TABLE等修改数据库的语句,各种不同的RDBMS都有较大语法差异。特点六、解决各种跨RDBMS的移植问题 1、DML操作、自增值处理与返回、查询这些不同数据库操作差异很大的东西,都了统一的封装。 2、DDL操作、建表、删表、trunacte,Sequence创建和TABLE模拟Sequence等,都做了支持。 3、对SQL语法操作和函数的改写与支持。其他特性轻量 该框架对应用环境、连接池、 是否为J2EE应用等没有特殊要求。可以和EJB集成,也可与Spring集成,也可以单独使用。整个框架只有两个JAR包,模块和功能都较为轻量。依赖少 整个框架只有三个jar库。间接依赖仅有commons-lang, slf4j等7个通用库,作为一个ORM框架,对第三方依赖极小。简单直接的API 框架的API设计直接面向数据库操作,不绕弯子,开发者只需要数据库基本知识,不必学习大量新的操作概念即可使用API完成各种DDL/DML操作。 最大限度利用编译器减少编码错误的可能性 API设计和元数据模型(meta-model)的使用,使得常规的数据库查询都可以直接通过Criteria API来完成,无需使用任何JPQL/HQL/SQL。可以让避免用户犯一些语法、拼写等错误。JPA2规范兼容 使用JPA 2.0规范的标准注解方式来定义和操作对象。(但整个ORM不是完整的JPA兼容实现)更高的性能 依赖于ASM等静态字节码技术而不是CGlib,使得改善了代理性能;依赖于动态反射框架,内部数据处理上的开销几乎可以忽略。操作性能接近JDBC水平。对比某H开头的框架,在写入操作上大约领先30%,在大量数据读取上领先50%以上。更多的性能调优手段 debug模式下提供了大量性能日志,帮您分析性能瓶颈所在。同时每个查询都可以针对batch、fetchSize、maxResult、缓存、级联操作类型等进行调整和开关,可以将性能调到最优。可在主流数据库之间任意切换 支持Oracle、MySQL、Postgres、MSSQL、GBase、SQLite、HSQL、Derby等数据库。除了API方式下的操作能兼容各个数据库之外,就连SQL的本地化查询也能使之兼容。JMX动态调节 可以用JMX查看框架运行统计。框架的debug开关和其他参数都可以使用JMX动态调整。动态表支持 表结构元数据的API也向用户开放,同时支持在使用过程,灵活调整映射关系,因此用户可以用API动态的创建表结构的模型,从而实现各种动态类型和表的映射(例如POJO包含一个Map,用于映射各种动态扩展的字段)企业级特性支持 SQL分析,性能统计,分库分表,Oracle RAC支持,读写分离支持 标签:eform

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值