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

Android学习—数据库的增删改查(sqliteCRUD)

上一篇文章介绍了sqlite数据库的创建,以及数据的访问,本文将主要介绍数据库的增删改查.下面直接看代码:MyDBHelper.java(创建数据库,添加一列phone)packa

上一篇文章介绍了sqlite数据库的创建,以及数据的访问,本文将主要介绍数据库的增删改查.

下面直接看代码:

MyDBHelper.java(创建数据库,添加一列phone)

package com.amos.android_database;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* Created by amosli on 14-6-10.
*/
public class MyDBHelper extends SQLiteOpenHelper{
/**
* 创建数据库的构造方法
*
@param context 应用程序上下文
* name 数据库的名字
* factory 查询数据库的游标工厂一般情况下用sdk默认的
* version 数据库的版本一般大于0
*/
public MyDBHelper(Context context) {
super(context, "test.db", null, 4);
}
private String tag = "MyDBHelper.class";
/**
* 在数据库第一次创建时会执行
*
@param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.d(tag,
"onCreate.....");
//创建一个数据库
db.execSQL("create table person (personid integer primary key autoincrement ,name varchar(30) )");
}
/**
* 更新数据的时候调用的方法
*
@param db
*
@param oldVersion
*
@param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d(tag,
"onUpgrade*******");
//增加一列
db.execSQL("alter table person add phone varchar(13) null");
}
}

 

PersonDao.java(增删查改都在这了)

package com.amos.android_database.dao;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.amos.android_database.MyDBHelper;
import com.amos.android_database.domain.Person;
import java.util.ArrayList;
import java.util.List;
/**
* Created by amosli on 14-6-11.
*/
public class PersonDao {
private MyDBHelper myDBHelper;
public String tag = "PersonDao.class";
//在new出来的时候就实现myDBHelper初始化
public PersonDao(Context context) {
myDBHelper
= new MyDBHelper(context);
}
//增加
public void addPerson(String name, String phone) {
SQLiteDatabase database
= myDBHelper.getWritableDatabase();
//先判断数据库是否可用
if (database.isOpen()) {
//执行插入操作
//database.execSQL("insert into person (name,phone) values('"+name+"','"+phone+"')");
//推荐如下写法
database.execSQL("insert into person (name,phone) values(?,?)", new Object[]{name, phone});
database.close();
}
}
//查找
public boolean findPerson(String phone) {
boolean result = false;
SQLiteDatabase database
= myDBHelper.getReadableDatabase();
if (database.isOpen()) {
//database.execSQL("select * from phOne='"+phone+"'");

Cursor cursor
= database.rawQuery("select * from person where phOne=?", new String[]{phone});
if (cursor.moveToFirst()) {//游标是否移动到下一行,如果是,那说明有数据返回
Log.d(tag, "count:" + cursor.getColumnCount());
int nameIndex = cursor.getColumnIndex("name");
Log.d(tag,
"name:" + cursor.getString(nameIndex));
cursor.close();
result
= true;
}
else {
result
= false;
}
database.close();
}
return result;
}
//删除一条数据
public void deletePerson(String phone) {
SQLiteDatabase database
= myDBHelper.getWritableDatabase();
if (database.isOpen()) {
database.execSQL(
"delete from person where phOne=?", new Object[]{phone});
}
database.close();
}
//更新一条数据
public void updatePerson(String phone, String newName, String newPhone) {
SQLiteDatabase database
= myDBHelper.getWritableDatabase();
if (database.isOpen()) {
database.execSQL(
"update person set name=?,phOne=? where phOne=?", new Object[]{newName, newPhone, phone});
}
database.close();
}
//查找所有person
public List

findAllPerson(){
List

persOnList= new ArrayList

();
SQLiteDatabase database
= myDBHelper.getReadableDatabase();
if(database.isOpen()){
Cursor cursor
= database.rawQuery("select * from person ", null);
while(cursor.moveToNext()){
int nameIndex = cursor.getColumnIndex("name");
int phOneIndex= cursor.getColumnIndex("phone");
String name
= cursor.getString(nameIndex);
String phone
= cursor.getString(phoneIndex);
Person person
= new Person(name,phone);
Log.d(tag,person.toString());
personList.add(person);
}
}
database.close();
return personList;
}
}

注:

1.由上面的方法可以看到,查找数据主要调用的是rawQuery方法,而增删改都是通过execSQL执行数据的

2.一定要注意,使用database前一定要判断是否可用,使用database.isOpen();

3.使用完database一定要注意关闭数据库,database.close();不然会报异常!

 

AndroidManifest.xml(配置测试环境,看加粗部分)

xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package
="com.amos.android_database"
android:versionCode
="1"
android:versionName
="1.0">
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage
="com.amos.android_database"/>

<uses-sdk android:minSdkVersion="7"/>
<application android:label="@string/app_name">
<uses-library android:name="android.test.runner"/>
<activity android:name="MyActivity"
android:label
="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
intent-filter>
activity>
application>
manifest>

测试类PersonDaoTest.java

package com.amos.android_database.test;
import android.test.AndroidTestCase;
import android.util.Log;
import com.amos.android_database.dao.PersonDao;
import com.amos.android_database.domain.Person;
/**
* Created by amosli on 14-6-11.
*/
public class PersonDaoTest extends AndroidTestCase{
private String tag = "PersonDaoTest.class";
public void testAdd() throws Exception{
PersonDao personDao
= new PersonDao(getContext());
for(int i=0;i<100;i++){
personDao.addPerson(
"amsoli"+i,"131888870"+i);
}
Log.d(tag,
"添加一些新用户");
}
public void testFind(){
PersonDao personDao
= new PersonDao(getContext());
boolean result = personDao.findPerson("13188887776");
assertEquals(
true,result);
}
public void testDelete(){
PersonDao personDao
= new PersonDao(getContext());
personDao.deletePerson(
"13188887778");
}
public void testUpdate(){
PersonDao personDao
= new PersonDao(getContext());
personDao.updatePerson(
"13188887776","hi_amos","13188887775");
}
public void testFindAllPerson(){
PersonDao personDao
= new PersonDao(getContext());
for (Person person : personDao.findAllPerson()) {
System.out.println(person.toString());
}
}
}

 

 由于要反复测试,所以如果将数据库反复导出会非常麻烦,下面可以使用命令进行查看数据库中的数据:

1)进行命令行模式,注意是在platform-tools目录下,而非tools目录

sdk/platform-tools$ ./adb shell

2)使用cd命令切换到test.db的目录

#cd /data/data/com.amos.android_database/databases/
#
ls
test.db

3)使用sqlite3打开test.db

# sqlite3 test.db
SQLite version
3.5.9
Enter
".help" for instructions
sqlite
> .database
seq name file
--- --------------- ----------------------------------------------------------
0 main /data/data/com.amos.android_database/databases/test.db
sqlite
> .table
android_metadata person

查看其中的数据:

sqlite> select * from person;
1|amsoli0|1318888700
2|amsoli1|1318888701
3|amsoli2|1318888702
4|amsoli3|1318888703
5|amsoli4|1318888704
6|amsoli5|1318888705
7|amsoli6|1318888706
8|amsoli7|1318888707
9|amsoli8|1318888708
.........

 

 

注:

i:关于Sqlite的教程可以参考:http://www.w3cschool.cc/sqlite/sqlite-tutorial.html

ii:关于本方源代码可以查看:https://github.com/amosli/android_basic/tree/database

 

 



推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
author-avatar
老鼠扛着刀找猫_592
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有