android增删功能代码,Android SQLite增删查改实例代码部分
在 Android与SQLite数据库 这个专题里我们谈到了 SQLite 的基本应用,但在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自 SQLiteOpenHelper 类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。下面,我们就以一个实例来讲解具体的用法。
程序比较简单,由以下五个文件组成:
TestDBActivity.java
listView_db.xml
User.java
DBHelper.java
DBManager.java
1. 首先编写 DBHelper,它继承了 SQLiteOpenHelper,作为维护和管理数据库的基类。
数据库第一次创建时onCreate方法会被调用,我们可以执行创建表的语句,当系统发现版本变化之后,会调用onUpgrade方法,我们可以执行修改表结构等语句。
package net.nowamagic.test;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "nowamagic.db";
private static final int DATABASE_VERSION = 1;
public DBHelper(Context context) {
//CursorFactory设置为null,使用默认值
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
//数据库第一次被创建时onCreate会被调用
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS user" +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER, info TEXT)");
}
//如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("ALTER TABLE user ADD COLUMN other STRING");
}
}
2. 为了方便我们面向对象的使用数据,我们建一个 User 类,对应 user 表中的字段,如下:
package net.nowamagic.test;
public class User {
public int _id;
public String name;
public int age;
public String info;
public User() {
}
public User(String name, int age, String info) {
this.name = name;
this.age = age;
this.info = info;
}
}
3. 然后,我们需要一个DBManager,来封装我们所有的业务方法,代码如下:
我们在DBManager构造方法中实例化DBHelper并获取一个SQLiteDatabase对象,作为整个应用的数据库实例;在添加多个Person信息时,我们采用了事务处理,确保数据完整性;最后我们提供了一个closeDB方法,释放数据库资源,这一个步骤在我们整个应用关闭时执行,这个环节容易被忘记,所以朋友们要注意。
package net.nowamagic.test;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.widget.Toast;
public class DBManager {
private DBHelper helper;
private SQLiteDatabase db;
Context c;
public DBManager(Context context) {
helper = new DBHelper(context);
//因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0, mFactory);
//所以要确保context已初始化,我们可以把实例化DBManager的步骤放在Activity的onCreate里
db = helper.getWritableDatabase();
c = context;
}
/**
* add users
* @param users
*/
public void add(List users) {
db.beginTransaction(); //开始事务
try {
for (User user : users) {
db.execSQL("INSERT INTO user VALUES(null, ?, ?, ?)", new Object[]{user.name, user.age, user.info});
}
db.setTransactionSuccessful(); //设置事务成功完成
} finally {
db.endTransaction(); //结束事务
}
}
/**
* update user's age
* @param user
*/
public void insertUser(User user) {
ContentValues cv = new ContentValues();
cv.put("age", user.age);
cv.put("name", user.name);
cv.put("info", user.info);
long rowid = db.insert("user", null, cv);
Toast.makeText(c, "已插入一条测试数据,id =" + rowid, Toast.LENGTH_SHORT).show();
}
/**
* update user's age
* @param user
*/
public void updateAge(User user) {
ContentValues cv = new ContentValues();
cv.put("age", user.age);
db.update("user", cv, "name = ?", new String[]{user.name});
}
/**
* delete old user
* @param user
*/
public void deleteOldUser(User user) {
//db.delete("user", "age >= ?", new String[]{String.valueOf(user.age)});
int lastid = getTableRow();
user._id = lastid;
//String s = lastid;
//return lastid;
if(user._id > 0)
Toast.makeText(c, "已删除第 "+ lastid +" 行(最末行)数据", Toast.LENGTH_SHORT).show();
db.delete("user", "_id = ?", new String[]{String.valueOf(user._id)});
Log.i("nowamagicdb", "last_id=>" + lastid);
if(user._id == 0)
Toast.makeText(c, "数据库已清空", Toast.LENGTH_SHORT).show();
//db.delete("user", "_id = ?", new String[]{String.valueOf(user._id)});
}
/**
* query all users, return list
* @return List
*/
public List query() {
ArrayList users = new ArrayList();
Cursor c = queryTheCursor();
while (c.moveToNext()) {
User user = new User();
user._id = c.getInt(c.getColumnIndex("_id"));
user.name = c.getString(c.getColumnIndex("name"));
user.age = c.getInt(c.getColumnIndex("age"));
user.info = c.getString(c.getColumnIndex("info"));
users.add(user);
}
c.close();
return users;
}
/**
* query all users, return cursor
* @return Cursor
*/
public Cursor queryTheCursor() {
Cursor c = db.rawQuery("SELECT * FROM user", null);
return c;
}
/**
* close database
*/
public void closeDB() {
db.close();
}
public int getTableRow(){
Cursor c = queryTheCursor();
if (c.moveToLast() == false)
{
//为空的Cursor
return 0;
}
else
{
int user_id = c.getInt(c.getColumnIndex("_id"));
return user_id;
}
//c.moveToLast();
}
}
4. 最后就是 TestDBActivity 了:
package net.nowamagic.magicapp_v17;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.CursorWrapper;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import net.nowamagic.test.DBManager;
import net.nowamagic.test.User;
public class TestDBActivity extends Activity {
private DBManager mgr;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.testdb2);
listView = (ListView) findViewById(R.id.listView_db);
//初始化DBManager
mgr = new DBManager(this);
//Toast.makeText(getApplicationContext(), "欢迎来到简明现代魔法~", Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
//应用的最后一个Activity关闭时应释放DB
mgr.closeDB();
}
public void add(View view) {
ArrayList users = new ArrayList();
User user1 = new User("Vorn", 17, "堤格尔维尔穆德·冯伦");
User user2 = new User("Eleonora Viltaria", 17, "艾蕾欧诺拉·维尔塔利亚");
User user3 = new User("Ludmilla Lurie", 16, "琉德米拉·露利叶");
User user4 = new User("Sophia Obertas", 20, "苏菲亚·欧贝达斯");
User user5 = new User("Alexandra Alshavin", 22, "亚莉莎德拉·阿尔夏芬");
users.add(user1);
users.add(user2);
users.add(user3);
users.add(user4);
users.add(user5);
mgr.add(users);
Toast.makeText(this, "已添加测试数据", Toast.LENGTH_SHORT).show();
query(view);
}
public void insert(View view) {
User user = new User();
user.name = "Gonn";
user.age = 99;
user.info = "简明现代魔法";
mgr.insertUser(user);
query(view);
}
public void update(View view) {
User user = new User();
user.name = "Vorn";
user.age = 20;
mgr.updateAge(user);
}
public void delete(View view) {
User user = new User();
user.age = 30;
mgr.deleteOldUser(user);
query(view);
//Toast.makeText(this, "", Toast.LENGTH_SHORT).show();
}
public void query(View view) {
List users = mgr.query();
ArrayList> list = new ArrayList>();
for (User user : users) {
HashMap map = new HashMap();
map.put("name", user.name);
map.put("info", user.age + " years old, " + user.info);
list.add(map);
}
SimpleAdapter adapter = new SimpleAdapter(this, list, android.R.layout.simple_list_item_2,
new String[]{"name", "info"}, new int[]{android.R.id.text1, android.R.id.text2});
listView.setAdapter(adapter);
}
public void queryTheCursor(View view) {
Cursor c = mgr.queryTheCursor();
startManagingCursor(c); //托付给activity根据自己的生命周期去管理Cursor的生命周期
CursorWrapper cursorWrapper = new CursorWrapper(c) {
@Override
public String getString(int columnIndex) {
//将简介前加上年龄
if (getColumnName(columnIndex).equals("info")) {
int age = getInt(getColumnIndex("age"));
return age + " years old, " + super.getString(columnIndex);
}
return super.getString(columnIndex);
}
};
//确保查询结果中有"_id"列
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2,
cursorWrapper, new String[]{"name", "info"}, new int[]{android.R.id.text1, android.R.id.text2});
ListView listView = (ListView) findViewById(R.id.listView_db);
listView.setAdapter(adapter);
}
}
其XML如下:
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="2">
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="add"
android:onClick="add"/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="insert"
android:onClick="insert"/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="update"
android:onClick="update"/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="delete"
android:onClick="delete"/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="query"
android:onClick="query"/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="queryCursor"
android:onClick="queryTheCursor"/>
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
android:id="@+id/listView_db"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
演示效果如下:
后面分小节去慢慢解析这个简单的程序。
android增删功能代码,Android SQLite增删查改实例代码部分相关推荐
- backbonejs mvc框架的增删查改实例
一:开发环境 coffeescript和nodejs需要先安装,没装网上自己查安装步骤. 代码编写环境及esp框架下载: esp框架下载地址:https://github.com/nonocast/e ...
- android 仿ios动画效果代码,Android仿IOS上拉下拉弹性效果的实例代码
用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好:Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果.先看效果,感觉有些时候还 ...
- java jdom进行xml的增删改差_java使用DOM对XML文档进行增删改查操作实例代码
本文研究的主要是java使用DOM对XML文档进行增删改查操作的相关代码,具体实例如下所示. 源代码: package com.zc.homeWork18; import java.io.File; ...
- android 最新功能介绍,Android Studio 常用功能介绍
界面介绍 讲解1 这个界面,显示了我们使用 Android Studio时经常接触到的功能面板. Project 面板. 用于浏览项目文件. Project 面板会显示当前的所有的 module . ...
- android手电筒功能吗,android通过led实现手电筒功能
本文实例为大家分享了android通过led实现手电筒功能的具体代码,供大家参考,具体内容如下 第一步添加权限: 第二步实现手电筒工具类: import android.hardware.Camera ...
- android签到功能开发,Android简单实现app每月签到功能
本文实例为大家分享了Android实现app每月签到功能的具体代码,供大家参考,具体内容如下 先上一张效果图: 其中这些签到的效果图是在网上找的,然后重要用到的控件就是 GridvVew 了, 代码很 ...
- android签到功能开发,Android应用开发之Android简单实现app每月签到功能
本文将带你了解Android应用开发Android简单实现app每月签到功能,希望本文对大家学Android有所帮助. 本文实例为大家分享了Android实现app每月签到功能的具体代码,供大家参考, ...
- android碎片功能实现,Android 列表碎片
Android 列表碎片 列表碎片的基本实现是用来在碎片中创建项目列表 实例 这个实例解释如何基于 ArrayAdapter 来创建列表碎片.让我们按照下面的步骤开始: 步骤 描述 1 使用 Andr ...
- android封装全局调用的toast_Android Toast提示封装实例代码
Android Toast提示封装 Android中经常用到Toast提示,项目中很多Toast提示,写很长的一行,简单的封装一下,将Toast方法提出来,很方便使用: 实例代码: /** * 提示字 ...
最新文章
- nginx产生【413 request entity too large】错误的原因与解决方法
- Linux内核同步机制之(四):spin lock【转】
- BZOJ4105 THUSC2015平方运算(线段树)
- java 内存回收参数_JVM常用参数(内存分配 内存回收日志)(七)
- 数学家破解婚恋网站配对程序,90天找到灵魂伴侣
- Python Interview Question and Answers
- 三、MyBatis 使用传统 Dao 开发方式
- python时间控件遮罩层_jquery遮罩层插件
- python编程100个小程序-整理了适合新手的20个Python练手小程序
- docker搭建私有仓库笔记
- DPad down是哪个键_投影仪前3甲PK:双十一坚果J7S和当贝D3X投影仪选择哪个
- 技巧:如何从苹果Mac跟踪设备上所有电池的电量?
- 安装卸载Windows服务方法(2种方法)
- IRS beamforming 译
- matlab相关性分析(皮尔逊,肯德尔,斯皮尔曼)
- 今日金融词汇---股价复权,是什么?
- GitHub中国区前100名到底是什么样的人?(转载)
- 批量删除微博的js代码
- 中文数字与阿拉伯数字转换(Python)
- 计算机组成原理mgk换算,计算机组成原理十套卷(本科)计算题及答案
热门文章
- 这份大厂面试真题之蚂蚁金服,已经通过很多内部人员的证实!建议收藏 ,反复观看!(一)
- 算法基础部分6-贪心算法
- .Net Core Json序列化和反序列化以及自定义JsonConverterT来转化特殊日期时间格式
- 猎魂觉醒手机和微信同服务器吗,猎魂觉醒ios和安卓能一起玩吗 猎魂觉醒安卓和ios数据互通吗...
- 无人机三维建模(2) 大疆Phantom4 advanced
- 跟阿婷一起学SPSS 01【spss,初次见面,请多多关照】
- 近200篇云计算、虚拟化、Hadoop、MapReduce、HDFS等云计算相关资料整理下载
- JVM内存 大小设置
- Echarts数据可视化 第4章 Echarts可视化图 4.7 漏斗图
- SpringCloud上传大文件的三种解决方案