热门标签 | 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});}
}


推荐阅读
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
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社区 版权所有