Android之CursorAdapter用法

掌握SQLite适配器:Android数据绑定实践 Android应用开发中离不开数据存储,而SQLite是Android平台上的轻量级关系型数据库,它为应用程序提供了一种高效的方式来存储结构化数据。SQLite的数据库存储是以文件的形式存在,不需要一个单独的服务器进程或系统来管理。Android为SQLite数据库提供了丰富的API支持,使得开发者能够以一种简单而直接的方式进行数据的增删改查操作。SQLite不仅提供了标准的SQL语句支持,还通过Database Helper类简化了数据库的创建和版本管理过程。 阅读详情

参考文档:

http://www.it165.net/pro/html/201308/6827.html

http://stackoverflow.com/questions/12223293/cursoradapter-bindview-optimization

ListView数据来自数据库

CursorAdapter 继承了 BaseAdapter

好处:仅加载需要显示的数据,性能好

 

使用方法:

1.实现两个参数构造方法

2.重写newView()方法

 layout->view

3.重写bindView()方法

 view.set

 

数据更新:

adapter.changeCursor(cursor);

adapter.notifyDataSetChanged()

 

代码如下:


01. public class MySqliteOpenhelper extends SQLiteOpenHelper
02. {
03.  
04. public MySqliteOpenhelper(Context context,  int version)
05. {
06. super(context, "dianhuaben.db", null, version);
07. }
08. @Override
09. public void onCreate(SQLiteDatabase db)
10. {//注意:使用CursorAdapter时,创建表必须有以_id为列名的列
11. String sql = "CREATE TABLE dhb (_id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20),phone VARCHAR(20))";
12. db.execSQL(sql);
13. }
14. @Override
15. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
16. {
17. }
18. }

使用CursorAdapter的代码如下:

 

01. public void createCursorAdapter(Cursor cursor)
02. { //游标适配器,构造方法,传入cursor
03. mAdapter = new CursorAdapter(this, cursor)
04. {//重写两个方法
05. @Override
06. public View newView(Context context, Cursor cursor, ViewGroup parent)
07. {//找到布局和控件
08. ViewHolder holder = new ViewHolder();
09. LayoutInflater inflater = getLayoutInflater();
10. View inflate = inflater.inflate(R.layout.listview_item, null);
11. holder.item_tv_name = (TextView) inflate.findViewById(R.id.item_tv_name);
12. holder.item_tv_phone = (TextView) inflate.findViewById(R.id.item_tv_phone);
13. inflate.setTag(holder);
14. return inflate;//返回的view传给bindView。
15. }
16.  
17. @Override
18. public void bindView(View view, Context context, Cursor cursor)
19. {//复用布局。www.it165.net
20. //                把数据设置到界面上
21. ViewHolder holder = (ViewHolder) view.getTag();
22. String name = cursor.getString(cursor.getColumnIndex("name"));
23. String phone = cursor.getString(cursor.getColumnIndex("phone"));
24. holder.item_tv_name.setText(name);
25. holder.item_tv_phone.setText(phone);
26. }
27.  
28. };
29.  
30. };

另一种是使用SimpleCursorAdapter,简化了代码,同样达到如上的效果

SimpleCursorAdapter继承了CursorAdapter,用法类似SimpleAdapter。

代码如下:



1. public void createSimpleCursorAdapter(Cursor cursor)
2. {// SimpleCursorAdapter继承了CursorAdapter继承了BaseAdapter
3. String[] from = {TABLE_NAME_NAME,TABLE_NAME_PHONE};//列名与控件id一一对应
4. int[] to = {R.id.item_tv_name,R.id.item_tv_phone};
5. //用的是SimpleCursorAdapter,用法和simpleAdapter相似
6. mAdapter = new SimpleCursorAdapter(MainActivity.this, R.layout.listview_item, cursor, from, to);
7. }

注意:使用SimpleCursorAdapter,时,创建表必须有以_id为列名的列



在使用时提示了一个错误:java.lang.IllegalArgumentException: column '_id' does not exist,

解决参考:http://blog.sina.com.cn/s/blog_6afeac500100ypzz.html


在使用SimpleCursorAdapter()显示SQLite数据库表中的数据的时候,Eclipse没有代码部分的错误提示,但程序会莫名其妙在运行时出错,而我们又找不到症结所在,报错如下:
显示:java.lang.IllegalArgumentException: column '_id' does not exist

 

而假如我们的数据表列名中并未定义名为“_id”的列名,如:我的数据表中定义了三列,列名分别为:“_id1”,”name1”,”bir”,这样,我的表根本和“_id”的列没有关系,那么上面的报错由何而来?

(ps:如果你的数据表中刚好就把某一列定义成了_id,那么肯定是不会出现这种错误了)

查找原因:  

仔细查看Android的开发文档中有关SimpleCursorAdapter()的说明发现,SimpleCursorAdapter()的父类是CursorAdapter(),CursorAdapter()有一个很隐蔽的规定: SimpleCursorAdapter <wbr><wbr>java.lang.IllegalArgumentException<wbr><wbr>: <wbr><wbr>column <wbr><wbr>'_id' <wbr><wbr>does <wbr><wbr>not <wbr><wbr>exist


SimpleCursorAdapter <wbr><wbr>java.lang.IllegalArgumentException<wbr><wbr>: <wbr><wbr>column <wbr><wbr>'_id' <wbr><wbr>does <wbr><wbr>not <wbr><wbr>exist

      

上 面显示:The Cursor must include a column named "_id" or this class will not work.也就是说,我们查询结果集游标Cursor返回的数据中,一定要有一列名为“_id”,否则这个类将不起作用,这也就是为什么Eclipse会 报上面的错误。

    (PS:经过测试,如果查询语句的相关代码无误,其实游标Cursor中已经读入数据表的内容,只是因为上述而不能正确输出,致使程序运行报错如下:解决方案:

    这种情况无需修改数据库。为满足CursorAdapter()类的要求,我们可以在查询语句相关代码中作如下修改,使之满足CursorAdapter()方法有关列名"_id"的规定即可:

(ps:chi数据表三列名为:_id1,name1,bir)

原代码:

   

view plaincopy to clipboardprint?

1.               public Cursor getAll(){  

2.             

3.                  return db.rawQuery("SELECT * FROM chi", null);  

4.             

5.           }  

 

修改后代码:

view plaincopy to clipboardprint?

1.           public Cursor getAll(){  

2.             

3.                  return db.rawQuery("SELECT _id1 AS _id ,name1 , bir FROM chi", null);  

4.             

5.               }  

 

在查询语句里改了以后,还要在相应的输出设置里面改,

也就是SimpleCursorAdapter(Context context, int layout, Curso c, String[] from, int[] to)这个函数中的from中也要输出一个名为"_id"的对应列才能成功
SAP S/4HANA 物料分类账(ML)/实际成本核算(Actual Costing)——底表全景 & CKMLCP 执行后数据变化 插入 ML 重估凭证行项目:Dr/Cr 库存科目(期末库存调整)、Dr/Cr COGS/消耗科目(消耗重估)、Cr/Dr ML 重估抵消科目(PRY/PRV 类逻辑)also STPRS/VERPR/PEINH/LBKUM 等(但 S/4 很多“真理”在 ACDOCA)MLPP / MLPPF / MLCR / MLCRF / MLCD / CKMLMV003/004 等。Material Ledger Document(行项目明细:收货/发票价差/结算写入/重估相关)间接(PUP在CKMLCR; 阅读详情

相关推荐

Air780E模组AT指令实战:5分钟搞定MQTT连接EMQX服务器(附完整代码)

本文详细介绍了如何使用Air780E 4G模组通过AT指令快速连接MQTT服务器。从硬件接线、网络注册到MQTT连接配置,提供了完整的实战步骤和代码示例,帮助开发者快速实现物联网设备的数据上报与远程通信。

wdx012345的博客 743

Android 中 CursorAdapter 的用法

前段时间做一个app被cursoradapter中没有position困扰了很久,在网上大量搜索

yan66665的专栏 1155

现代 AI Agent 编排技术全景(1)—— 分类体系与四大技术维度

本文介绍基于 LLM 的现代 Agent 分类体系与四大技术维度,形成能够刻画不同 Agent 产品架构特征的分类法

佚失的诗篇 236

BERTopic主题建模:从语义理解到自动化文本分析实践

主题建模是自然语言处理中的核心技术,旨在从非结构化文本中自动发现潜在主题结构。其核心原理是通过算法识别文档集合中词汇的共现模式,将语义相似的文档归为同一主题。传统方法如LDA基于词袋模型,存在无法理解语义、调参复杂等局限。随着预训练语言模型的发展,现代主题建模技术能够利用深度语义表示,显著提升主题一致性与可解释性。BERTopic正是这一技术趋势的代表,它结合了Transformer的语义嵌入能力与密度聚类算法,实现了端到端的自动化主题提取。该框架特别适用于海量文本数据的分析场景,如用户反馈挖掘、新闻分类和

weixin_34128839的博客 343

STM32 IAP+APP合并Hex文件全自动脚本(Keil5一键生成)

本文详细介绍了一种基于Keil5开发环境的STM32 IAP与APP程序Hex文件全自动合并方案。通过编写批处理或Python脚本,并将其集成到Keil的编译后流程中,实现一键编译、自动合并,彻底解决手动操作繁琐易错的问题,极大提升STM32固件开发与远程升级的效率。

weixin_29191761的博客 306

CUDA详细安装及环境配置——环境配置指南 – CUDA+cuDNN+PyTorch 安装

本文详细介绍了如何确定显卡支持的CUDA版本、选择对应的cuDNN版本,并逐步安装CUDA、cuDNN和PyTorch。首先,通过命令行输入nvidia-smi.exe查看显卡支持的CUDA版本。接着,根据CUDA版本选择对应的cuDNN版本并下载。然后,从NVIDIA官方网站下载CUDA安装包,按照提示进行安装,并检查是否安装成功。同样地,下载cuDNN安装包,解压后将文件拷贝到CUDA安装目录中,并通过命令行验证安装是否成功。最后,根据PyTorch官网的指引,选择合适的安装命令进行PyTorch的安装

2501_90350274的博客 5098

Android中CursorAdapter的使用详解

转:http://blog.youkuaiyun.com/dmk877/article/details/44983491 一、CursorAdapter介绍 CursorAdapter这个类是继承于BaseAdapter的它是一个虚类它为Cursor和ListView连接提供了桥梁 二、CursorAdapter详解 1.CursorAd

zhangmiaoping23的专栏 1218

fastadmin云快充充电桩系统部署文档uniapp

多商户 嘎嘎快充V1.0部署文档 一、服务器环境: 服务器配置4核心8GB内存5M带宽以上配置 VX next1402 只支持linux环境 nginx1.22 php7.2 开启redis、fileinfo扩展,关闭禁用workerman gatewayworkerman需要的函数,如pcntl相关的函数 mysql5.7 supervisor redis 注意: 1.站点必须配置https、websocket配置wss 2.注意开放直连服务端口:2024,并添加到安全组 二、必

itholiday2014的博客 1629

android cursoradapter 刷新,Android CursorAdapter的使用详解

一、CursorAdapter介绍CursorAdapter这个类是继承于BaseAdapter的它是一个虚类它为Cursor和ListView连接提供了桥梁二、CursorAdapter详解1.CursorAdapter的继承关系图从图中可以看出CursorAdapter是继承于BaseAdapter的,它有一个直接的子类SimpleCursorAdapter2.CursorAdapter的用法...

weixin_39951018的博客 394

AD(十四)调用已有的PCB元件封装库

软件:Altium Designer 16 需要资料:已有的PCB原理图文件(.PCBDOC)或者PCB库文件(.PCBLIB)(来源文中细说) 调用已有的PCB元件封装库(一)从已有的PCB原理图文件(*.PCBDOC)中调用1、PCB原理图文件来源2、打开已有的PCB原理图文件(*.PCBDOC)3、生成PCB封装库4、复制封装到工程文件下的PCB库文件(*.PCBLIB)5、重名问题(二)从已有的PCB库文件(*.PCBLIB)中调用1、PCB库文件(*.PCBLIB)的来源2、打开已有的PCB库 (

Curnane0_0的博客 5083

ubuntu20.04搭建QGC4.2编译环境

QGC 4.2ubuntu18.04也可以编译QGC4.2,但是由于GLBC版本较低,无法使用最新版的QTCreator,Ubuntu20.04可以使用最新版QTCreator。

超维空间科技的博客 1万+

Android移动开发—Listview列表视图的使用讲解及SimpleAdapter实例(1)

main.xml说明:定义一个listivew组件

2401_84132449的博客 987

4、风险管理、信息安全与信息管理的核心原则

本文深入探讨了风险管理、信息安全与信息管理的核心原则,涵盖Risk IT框架、ISO 31000标准以及信息安全与信息管理的关键原则。通过案例分析与实际应用挑战的解析,帮助组织更好地应对数字化时代的风险与安全问题,实现可持续发展。

bread的博客 120

Android数据库内容变化的监听(附件2)

publicabstractclassCursorAdapterextendsBaseAdapterimplementsFilterable, CursorFilter.CursorFilterClient{-------------------省略------------------ protectedChangeObservermChangeObserver;/** *Thisf...

mmdev 126

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Adapter比较

ResourceCursorAdapter       继承于CursorAdapter,它包含LayoutInflater对象,可以把xml转化成view。成员函数newView和newDropDownView,根据构造函数初始化时传入或是setViewResource设置的资源id,产生对应的view并返回。   CursorAdapter        CursorA

Y敲键盘的地方 999

ssm框架搭建

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

Android列表类控件(Aapter)

列表类控件有3个要素:控件、Adapter(适配器)和数据源。数据源的提供有多种形式,可以来自数据库、XML文件、数组对象或者集合对象等。Adapter是一个适配器,一端连着控件,另一端连着数据源。不管是什么类型的数据,通过适配器后都能够给控件很好地使用,就相当于是一个转换接口。 不同的数据源,需要使用不同的适配器。数据库的适配器类为CursorAdapter,数组对象的适配器为ArrayAda

HorseRunningNoStop的博客 917

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android中文API(118)——FilterQueryProvider

正文 一、结构 public interfaceFilterQueryProvider android.widget.FilterQueryProvider   二、概述   这个类可以被CursorAdapter和CursorTreeAdapter用来定义如何过滤适配器的内容。     参见     runQ...

weixin_34221773的博客 140

Java与PHP技术选型全解析:从设计哲学到企业应用场景

在软件开发领域,编程语言的选择是技术架构的核心决策之一,它直接影响系统的可维护性、扩展性和开发效率。从技术原理层面看,强类型编译型语言通过严格的类型检查和编译期优化,为大型复杂系统提供了更高的稳定性和性能保障;而弱类型解释型语言则以灵活的语法和快速的开发迭代能力,在快速原型验证和简单Web应用中展现出独特优势。这两种不同的技术路径分别对应着企业级应用的高可靠要求与初创项目的敏捷开发需求。随着云原生和微服务架构的普及,技术选型更加注重生态整合与工程化实践,例如Java的Spring Boot框架和PHP的La

weixin_34341117的博客 415

ListActivity和ListView

本文转载整理自:http://www.sf.org.cn/Android/lumen/20980.html ListActivity。这个类其实就是一个含有一个ListView组件的Activity类。 也就是说,如果我们直接在一个普通的Activity中自己加一个ListView也是完全可以取代这个ListActivity的,只是它更方便而已。 package com.teleca; i

Robin Hu的专栏 3573

Android(12、下拉列表Spinner)

下拉列表(Spinner)是Android中常用的UI控件,用于显示一个可展开的列表,用户可以从中选择一个选项。可以通过设置属性来直接在XML中定义Spinner的选项列表,或者在后续的Java代码中设置适配器。其中,data是一个包含要显示在Spinner中的选项的字符串数组。适配器负责将数据源与Spinner控件进行绑定,并定义了选项的显示方式。在监听器的方法中,可以通过获取用户选择的选项。可以根据选项执行相应的操作。方法在没有选项被选择时触发。

yiyuanpeng2004的博客 1462

ListView的各种适配器

学习至今,发现ListView有好几种适配器,用法不同,各有优缺点,在此做个小总结:1、BaseAdapter(基本适配器) 其缺点是用法比较复杂一些,但是因为不受其他限制,所以被广泛应用。 用法: a、创建一个类继承BaseAdapter,重写它的四个方法。四个方法中,有两个方法很少用到,必 须用到的是getView()和getCount()方法,...

weixin_33985679的博客 699
上一篇: 安卓Binder
下一篇: windows删除samba记录
bldream
博客等级 码龄15年 0粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值