热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLite数据库CRUD操作实例分析与应用

本文通过分析和实例演示了SQLite数据库中的CRUD(创建、读取、更新和删除)操作,详细介绍了如何在Java环境中使用Person实体类进行数据库操作。文章首先阐述了SQLite数据库的基本概念及其在移动应用开发中的重要性,然后通过具体的代码示例,逐步展示了如何实现对Person实体类的增删改查功能。此外,还讨论了常见错误及其解决方法,为开发者提供了实用的参考和指导。

Person实体类

http://www.cnblogs.com/linjiqin/archive/2011/05/27/2059937.html

package com.ljq.domain;public class Person {private Integer id;private String name;private String phone;public Person() {super();}public Person(String name, String phone) {super();this.name = name;this.phone = phone;}public Person(Integer id, String name, String phone) {super();this.id = id;this.name = name;this.phone = phone;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}}

         

           

DBOpenHelper数据库关联类

package com.ljq.db;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;public class DBOpenHelper extends SQLiteOpenHelper {// 类没有实例化,是不能用作父类构造器的参数,必须声明为静态
private static final String DBNAME = "ljq.db";private static final int VERSION = 1;// 第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,// 设置为null,代表使用系统默认的工厂类
public DBOpenHelper(Context context) {super(context, DBNAME, null, VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE PERSON (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME VARCHAR(20), PHONE VARCHAR(20))");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 注:生产环境上不能做删除操作
db.execSQL("DROP TABLE IF EXISTS PERSON"); onCreate(db);}
}

            

               

PersonService业务类

package com.ljq.db;import java.util.ArrayList;
import java.util.List;import android.content.Context;
import android.database.Cursor;import com.ljq.domain.Person;public class PersonService {private DBOpenHelper dbOpenHelper &#61; null;/*** 构造函数* * 调用getWritableDatabase()或getReadableDatabase()方法后&#xff0c;会缓存SQLiteDatabase实例&#xff1b;* 因为这里是手机应用程序&#xff0c;一般只有一个用户访问数据库&#xff0c;所以建议不关闭数据库&#xff0c;保持连接状态。* getWritableDatabase()&#xff0c;getReadableDatabase的区别是当数据库写满时&#xff0c;调用前者会报错&#xff0c;调用后者不会&#xff0c;* 所以如果不是更新数据库的话&#xff0c;最好调用后者来获得数据库连接。* * 对于熟悉SQL语句的程序员最好使用exeSQL(),rawQuery(),因为比较直观明了* * &#64;param context*/ public PersonService(Context context){dbOpenHelper &#61; new DBOpenHelper(context);}public void save(Person person){dbOpenHelper.getWritableDatabase().execSQL("insert into person(name, phone) values (?, ?)", new Object[]{person.getName(), person.getPhone()});}public void update(Person person){dbOpenHelper.getWritableDatabase().execSQL("update person set name&#61;?, phone&#61;? where id&#61;?", new Object[]{person.getName(), person.getPhone(), person.getId()});}public void delete(Integer... ids){if(ids.length>0){StringBuffer sb &#61; new StringBuffer();for(Integer id : ids){sb.append("?").append(",");}sb.deleteCharAt(sb.length() - 1);dbOpenHelper.getWritableDatabase().execSQL("delete from person where id in ("&#43;sb&#43;")", (Object[])ids);}}public Person find(Integer id){Cursor cursor &#61; dbOpenHelper.getReadableDatabase().rawQuery("select id, name, phone from person where id&#61;?", new String[]{String.valueOf(id)});if(cursor.moveToNext()){int personid &#61; cursor.getInt(0);String name &#61; cursor.getString(1);String phone &#61; cursor.getString(2);return new Person(personid, name, phone);}return null;}public long getCount(){Cursor cursor &#61; dbOpenHelper.getReadableDatabase().query("person", new String[]{"count(*)"}, null,null,null,null,null);if(cursor.moveToNext()){return cursor.getLong(0);}return 0;}/*** 分页* * &#64;param startResult 偏移量&#xff0c;默认从0开始* &#64;param maxResult 每页显示的条数* &#64;return*/public List<Person> getScrollData(int startResult, int maxResult){List<Person> persons &#61; new ArrayList<Person>();//Cursor cursor &#61; dbOpenHelper.getReadableDatabase().query("person", new String[]{"id, name, phone"}, // "name like ?", new String[]{"%ljq%"}, null, null, "id desc", "1,2");
Cursor cursor &#61; dbOpenHelper.getReadableDatabase().rawQuery("select * from person limit ?,?", new String[]{String.valueOf(startResult), String.valueOf(maxResult)});while(cursor.moveToNext()) {int personid &#61; cursor.getInt(0); String name &#61; cursor.getString(1);String phone &#61; cursor.getString(2);persons.add(new Person(personid, name, phone));}return persons;}}

             

                  

PersonServiceTest测试类

package com.ljq.test;import java.util.List;import com.ljq.db.PersonService;
import com.ljq.domain.Person;import android.test.AndroidTestCase;
import android.util.Log;public class PersonServiceTest extends AndroidTestCase{private final String TAG &#61; "PersonServiceTest";public void testSave() throws Exception{PersonService personService &#61; new PersonService(this.getContext());personService.save(new Person("zhangsan1", "059188893343"));personService.save(new Person("zhangsan2", "059188893343"));personService.save(new Person("zhangsan3", "059188893343"));personService.save(new Person("zhangsan4", "059188893343"));personService.save(new Person("zhangsan5", "059188893343"));}public void testUpdate() throws Exception{PersonService personService &#61; new PersonService(this.getContext());Person person &#61; personService.find(1);person.setName("linjiqin");personService.update(person);}public void testFind() throws Exception{PersonService personService &#61; new PersonService(this.getContext());Person person &#61; personService.find(1);Log.i(TAG, person.getName());}public void testList() throws Exception{PersonService personService &#61; new PersonService(this.getContext());List<Person> persons &#61; personService.getScrollData(0, 10);for(Person person : persons){Log.i(TAG, person.getId() &#43; " : " &#43; person.getName());}}public void testCount() :/span>throws Exception{PersonService personService &#61; new PersonService(this.getContext());Log.i(TAG, String.valueOf(personService.getCount()));}public void testDelete() throws Exception{PersonService personService &#61; new PersonService(this.getContext());personService.delete(1);}public void testDeleteMore() throws Exception{PersonService personService &#61; new PersonService(this.getContext());personService.delete(new Integer[]{2, 5, 6});}
}


推荐阅读
  • 在C#中开发MP3播放器时,我正在考虑如何高效存储元数据以便快速检索。选择合适的数据结构,如字典或数组,对于优化性能至关重要。字典能够提供快速的键值对查找,而数组则在连续存储和遍历方面表现优异。根据具体需求,合理选择数据结构将显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • Go 项目中数据库配置文件的优化与应用 ... [详细]
  • 在尝试使用指定的数据库进行登录时,遇到了权限问题。具体表现为用户 'lzldb'@'%' 无权访问数据库 'lzldb',错误代码为 1044 (42000)。命令行参数 `-D` 指定了数据库名称,但未能成功连接。建议检查用户的权限配置,确保其具有对目标数据库的访问权限。此外,使用密码时应谨慎处理,避免在命令行中明文显示。 ... [详细]
  • 设计实战 | 10个Kotlin项目深度解析:首页模块开发详解
    设计实战 | 10个Kotlin项目深度解析:首页模块开发详解 ... [详细]
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • MySQL索引详解及其优化策略
    本文详细解析了MySQL索引的概念、数据结构及管理方法,并探讨了如何正确使用索引以提升查询性能。文章还深入讲解了联合索引与覆盖索引的应用场景,以及它们在优化数据库性能中的重要作用。此外,通过实例分析,进一步阐述了索引在高读写比系统中的必要性和优势。 ... [详细]
  • Node.js 配置文件管理方法详解与最佳实践
    本文详细介绍了 Node.js 中配置文件管理的方法与最佳实践,涵盖常见的配置文件格式及其优缺点,并提供了多种实用技巧和示例代码,帮助开发者高效地管理和维护项目配置,具有较高的参考价值。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 在使用Keil C51创建51单片机项目时,启动代码中包含多个关键元素,这些元素确保了系统的正确初始化和运行。主要包括复位向量、中断向量表、系统时钟配置、寄存器初始化以及主函数入口等。这些组件共同协作,为后续的应用程序执行提供稳定的基础。 ... [详细]
  • 在数据表中,我需要触发一个操作来刷新特定列的数据。例如,对于以下表格:| ID | Name | IsDeleted ||----|-------|-----------|| 1 | test | True || 2 | test2 | False |我希望在点击“更新”按钮时,能够仅刷新选定行的“IsDeleted”列。这将有助于确保数据的实时性和准确性。 ... [详细]
  • Java中处理NullPointerException:getStackTrace()方法详解与实例代码 ... [详细]
  • 初探设计模式之代理模式:原理与应用解析
    在设计模式中,代理模式通过一个代理对象来控制对真实对象的访问。UML图展示了代理类(如MathProxy)维护了一个引用,使得代理能够访问实际的主题对象。代理模式不仅能够延迟初始化昂贵的对象,还能在访问前后添加额外的操作,如权限检查或日志记录。这种模式在远程服务调用、虚拟代理和智能引用等方面有广泛应用。 ... [详细]
author-avatar
Resolve
愿你的生活,既有软肋又有盔甲!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有