SQLite数据库操作详细示例

简介: MainActivity如下: package cc.testdb;import java.util.List;import cc.


MainActivity如下:

package cc.testdb;

import java.util.List;
import cc.database.DBUtils;
import cc.domain.Person;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.app.Activity;
import android.content.Context;
/**
 * Demo描述:
 * SQLite数据操作
 * 
 * 参考资料:
 * http://blog.csdn.net/lfdfhl/article/details/8195378
 * 
 */
public class MainActivity extends Activity {
    private Button mAddButton;
    private Button mQueryButton;
    private Button mUpdateButton;
    private Button mDeleteButton;
    private Button mCountButton;
    private Button mPageButton;
    private Button mTransactionButton;
    private Context mContext;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				             WindowManager.LayoutParams.FLAG_FULLSCREEN);
		setContentView(R.layout.main);
		init();
	}
	
	private void init(){
		mContext=this;
		mAddButton=(Button) findViewById(R.id.addButton);
		mAddButton.setOnClickListener(new ClickListenerImpl());
		
		mQueryButton=(Button) findViewById(R.id.queryButton);
		mQueryButton.setOnClickListener(new ClickListenerImpl());
		
		mUpdateButton=(Button) findViewById(R.id.updateButton);
		mUpdateButton.setOnClickListener(new ClickListenerImpl());
		
		mDeleteButton=(Button) findViewById(R.id.deleteButton);
		mDeleteButton.setOnClickListener(new ClickListenerImpl());
		
		mCountButton=(Button) findViewById(R.id.countButton);
		mCountButton.setOnClickListener(new ClickListenerImpl());
		
		mPageButton=(Button) findViewById(R.id.pageButton);
		mPageButton.setOnClickListener(new ClickListenerImpl());
		
		mTransactionButton=(Button) findViewById(R.id.transactionButton);
		mTransactionButton.setOnClickListener(new ClickListenerImpl());
		
	}
	
	
	private class ClickListenerImpl implements OnClickListener {
		Person person=null;
		@Override
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.addButton:
				for (int i = 0; i < 15; i++) {
					person=new Person("xiaoming"+i, "9527"+i);
					DBUtils.add(mContext,person);
				}
				break;
			case R.id.queryButton:
				person=DBUtils.query(mContext,5);
				System.out.println(person);
				break;
			case R.id.updateButton:
				person=DBUtils.query(mContext,1);
				System.out.println("修改前:"+person);
				person=new Person(1, "xx", "1234");
				DBUtils.update(mContext,person);
				person=DBUtils.query(mContext,1);
				System.out.println("修改后:"+person);
				break;
			case R.id.deleteButton:
				DBUtils.delete(mContext,2);
				break;
			case R.id.countButton:
				int count=DBUtils.count(mContext);
				System.out.println("数据总量为:"+count);
				break;
			case R.id.pageButton:
				List<Person> list=DBUtils.page(mContext,4, 9);
				for (int i = 0; i < list.size(); i++) {
					 person=list.get(i);
					 System.out.println("分页的数据:"+person);
				}
				break;
			case R.id.transactionButton:
				person=new Person(1, "ccc", "8888");
				DBUtils.transaction(mContext,person);
				person=DBUtils.query(mContext,1);
				System.out.println("事务操作后:"+person);
				break;
			default:
				break;
			}
		}

	}
}

DataBaseOpenHelper如下:

package cc.database;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DataBaseOpenHelper extends SQLiteOpenHelper {
    private final static String DATABASE_NAME="test.db";
    private static DataBaseOpenHelper mDataBaseOpenHelper;
    //super(context, DATABASE_NAME, null, 1)方法:
    //若不存在DATABASE_NAME数据,则执行onCreate(SQLiteDatabase db)方法
    //若已经存在则不再新建数据库
    //方法中第三个参数为:version 版本号
    //当version变大时会自动调用
    //onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法
	public DataBaseOpenHelper(Context context) {
		super(context, DATABASE_NAME, null, 1);
	}

	
	//注意:
	//将DataBaseOpenHelper写成单例的.
	//否则当在一个for循环中频繁调用openHelper.getWritableDatabase()时
	//会报错,提示数据库没有执行关闭操作
	static synchronized DataBaseOpenHelper getDBInstance(Context context) {
		if (mDataBaseOpenHelper == null) {
			mDataBaseOpenHelper = new DataBaseOpenHelper(context);
		}
		return mDataBaseOpenHelper;
	} 
	
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("create table person(personid integer primary key autoincrement,name varchar(20),phone VARCHAR(12))");
	}

	//为person增加一个address字段,默认值为null
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("ALTER TABLE person ADD address VARCHAR(12) NULL");
	}

}

DBUtils如下:
package cc.database;
import java.util.ArrayList;
import java.util.List;
import cc.domain.Person;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class DBUtils {
	public static DataBaseOpenHelper openHelper;
	public static SQLiteDatabase db;
	
	public static void add(Context context,Person person){
		openHelper=DataBaseOpenHelper.getDBInstance(context);
		db=openHelper.getWritableDatabase();
        db.execSQL("insert into person (name,phone) values(?,?)",
        		    new Object[]{person.getName(),person.getPhone()});
		
	}
	
	//注意:
	// 1 rawQuery()方法查询后返回的结果是一个Cursor类的对象
    // 2 最后要关闭cursor即cursor.close();
	public  static Person query(Context context,int id){
		openHelper=DataBaseOpenHelper.getDBInstance(context);
		db=openHelper.getWritableDatabase();
		Cursor cursor=db.rawQuery("select * from person where personid=?", new String[]{String.valueOf(id)});
		while(cursor.moveToFirst()){
			int personid=cursor.getInt(cursor.getColumnIndex("personid"));
			String name=cursor.getString(cursor.getColumnIndex("name"));
			String phone=cursor.getString(cursor.getColumnIndex("phone"));
			return new Person(personid, name, phone);
		}
		cursor.close();
		return null;
	}
	
	
	//因为name和phone的类型都是String,但是id是整型的
	//所以这里的数组写成了Object类型的
	public  static void update(Context context,Person person){
		openHelper=DataBaseOpenHelper.getDBInstance(context);
		db=openHelper.getWritableDatabase();
		db.execSQL("update person set name=?,phone=? where personid=?",
				    new Object[]{person.getName(),person.getPhone(),person.getId()});
	}
	
	
	public  static void delete(Context context,int id){
		openHelper=DataBaseOpenHelper.getDBInstance(context);
		db=openHelper.getWritableDatabase();
        db.execSQL("delete from person where personid=?",new Object[]{String.valueOf(id)});
	}
	
	//在while循环里要注意终止循环,否则是个死循环
	//因为如果cursor不为空那么
	//cursor.moveToFirst()总是返回true
	public  static int count(Context context){
		openHelper=DataBaseOpenHelper.getDBInstance(context);
		db=openHelper.getReadableDatabase(); 
		Cursor cursor=db.rawQuery("select count(*) from person", null);
		int i=0;
		while(cursor.moveToFirst()){
		     i=cursor.getInt(0);
		     break;
		}
		return i;
	}
	
	public  static List<Person> page(Context context,int offset,int resuletNumber){
		openHelper=DataBaseOpenHelper.getDBInstance(context);
		db=openHelper.getWritableDatabase();
		ArrayList<Person> persons=new ArrayList<Person>();	
		Person person=null;
		Cursor  cursor=db.rawQuery("select * from person limit ?,?",
				                    new String []{String.valueOf(offset),String.valueOf(resuletNumber)});
		while(cursor.moveToNext()){
			int personid=cursor.getInt(cursor.getColumnIndex("personid"));
			String name=cursor.getString(cursor.getColumnIndex("name"));
			String phone=cursor.getString(cursor.getColumnIndex("phone"));
			person=new Person(personid, name, phone);
			persons.add(person);
		}
		return persons;
	  }
	
	/**
	 * 结束事务有两种:提交事务和回滚事务.
	 * 默认情况是回滚事务!!!!
	 * 事务是否提交是由事务的标志来决定:
	 * 如果事务的标志位失败(false),就回滚事务;否则(true)提交事务。
	 * 所以默认情况下事务的标志为失败(false)即回滚事务.
	 */
	public  static void transaction(Context context,Person person){
		openHelper=DataBaseOpenHelper.getDBInstance(context);
        db = openHelper.getWritableDatabase();
		//开启事务
		db.beginTransaction();
		try{
			db.execSQL("update person set name=? where personid=?",
					    new Object[]{person.getName(),person.getId()});
			db.execSQL("update person set phone=? where personid=?",
				    new Object[]{person.getPhone(),person.getId()});
			//设置事务的标志为成功
			db.setTransactionSuccessful();
		}finally{
			//结束事务,默认情况下是回滚事务
			db.endTransaction();
		}
	}
	
}


修改后的DBUtils

package cc.database;
import java.util.ArrayList;
import java.util.List;
import cc.domain.Person;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
/**
 * 在原来基础上修改后的DBUtils
 *  
 * 主要的修改:
 * 原来采用了原生的SQL语句进行增删改查
 * 现在改为利用Android自带的方法:
 * insert(String table, String nullColumnHack, ContentValues values)
 * delete(String table, String whereClause, String[] whereArgs)
 * update(String table, ContentValues values, String whereClause, String[] whereArgs)
 * query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)
 * 来实现
 * 2014年12月14日16:53:08
 */
public class DBUtils {
	public final static String TABLE_NAME="person";
	public static DataBaseOpenHelper openHelper;
	public static SQLiteDatabase db;
	
	
	/**
	 * 
	 * 利用SQLiteDatabase.insert(String table, String nullColumnHack, ContentValues values)方法插入数据
	 * 注意该方法的第二个参数:
	 * 用于在未指定添加数据的情况下给某些可为空的列自动赋值为NULL.一般情况下不会这么做,所以传入NULL即可.
	 * 
	 * 该操作等同于:
	 * db.execSQL("insert into person (name,phone) values(?,?)",new Object[]{person.getName(),person.getPhone()});
	 */
	public static void insertData(Context context,Person person){
		openHelper=DataBaseOpenHelper.getDBInstance(context);
		db=openHelper.getWritableDatabase();
		ContentValues contentValues=new ContentValues();
		contentValues.put("name", person.getName());
		contentValues.put("phone", person.getPhone());
        db.insert(TABLE_NAME, null, contentValues);
	}
	
	
	/**
	 * 利用SQLiteDatabase.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)
	 * 方法查询数据
	 * 
	 * 该操作等同于:
	 * Cursor cursor=db.rawQuery("select * from person where personid=?", new String[]{String.valueOf(id)});
	 * 注意:
	 * 1 rawQuery()方法查询后返回的结果是一个Cursor类的对象
	 * 2 最后要关闭cursor即cursor.close();
	 */
	public  static Person queryData(Context context,int id){
		openHelper=DataBaseOpenHelper.getDBInstance(context);
		db=openHelper.getWritableDatabase();
		Cursor cursor=db.query(TABLE_NAME, null, "personid=?",new String []{id+""}, null, null, null, null);
		while(cursor.moveToFirst()){
			int personid=cursor.getInt(cursor.getColumnIndex("personid"));
			String name=cursor.getString(cursor.getColumnIndex("name"));
			String phone=cursor.getString(cursor.getColumnIndex("phone"));
			return new Person(personid, name, phone);
		}
		cursor.close();
		return null;
	}
	
	
	/**
	 * 利用SQLiteDatabase.update(String table, ContentValues values, String whereClause, String[] whereArgs)
	 * 更新数据.
	 * 第二个参数表示要更新的内容
	 * 第三和第四个参数表示了要更新的列及其对应的值
	 * 注意第三个参数中占位符的使用
	 * 
	 * 该操作等同于:
	 * db.execSQL("update person set name=?,phone=? where personid=?",
	 *    new Object[]{person.getName(),person.getPhone(),person.getId()});
	 * 因为name和phone的类型都是String,但是id是整型的
	 * 所以这里的数组写成了Object类型的
	 */
	public  static void updateData(Context context,Person person){
		openHelper=DataBaseOpenHelper.getDBInstance(context);
		db=openHelper.getWritableDatabase();
		ContentValues contentValues=new ContentValues();
		contentValues.put("name", person.getName());
		contentValues.put("phone", person.getPhone());
        db.update(TABLE_NAME, contentValues, "personid=?", new String []{person.getId()+""});
	}
	
	
	/**
	 * 利用SQLiteDatabase.delete(String table, String whereClause, String[] whereArgs)
	 * 删除数据
	 * 
	 * 该操作等同于:
	 * db.execSQL("delete from person where personid=?",new Object[]{String.valueOf(id)});
	 */
	public  static void delete(Context context,int id){
		openHelper=DataBaseOpenHelper.getDBInstance(context);
		db=openHelper.getWritableDatabase();
        db.delete(TABLE_NAME, "personid=?", new String []{id+""});
	}
	
	//在while循环里要注意终止循环,否则是个死循环
	//因为如果cursor不为空那么
	//cursor.moveToFirst()总是返回true
	public  static int count(Context context){
		openHelper=DataBaseOpenHelper.getDBInstance(context);
		db=openHelper.getReadableDatabase(); 
		Cursor cursor=db.rawQuery("select count(*) from person", null);
		int i=0;
		while(cursor.moveToFirst()){
		     i=cursor.getInt(0);
		     break;
		}
		return i;
	}
	
	public  static List<Person> page(Context context,int offset,int resuletNumber){
		openHelper=DataBaseOpenHelper.getDBInstance(context);
		db=openHelper.getWritableDatabase();
		ArrayList<Person> persons=new ArrayList<Person>();	
		Person person=null;
		Cursor  cursor=db.rawQuery("select * from person limit ?,?",
				                    new String []{String.valueOf(offset),String.valueOf(resuletNumber)});
		while(cursor.moveToNext()){
			int personid=cursor.getInt(cursor.getColumnIndex("personid"));
			String name=cursor.getString(cursor.getColumnIndex("name"));
			String phone=cursor.getString(cursor.getColumnIndex("phone"));
			person=new Person(personid, name, phone);
			persons.add(person);
		}
		return persons;
	  }
	
	/**
	 * 结束事务有两种:提交事务和回滚事务.
	 * 默认情况是回滚事务!!!!
	 * 事务是否提交是由事务的标志来决定:
	 * 如果事务的标志位失败(false),就回滚事务;否则(true)提交事务。
	 * 所以默认情况下事务的标志为失败(false)即回滚事务.
	 */
	public  static void transaction(Context context,Person person){
		openHelper=DataBaseOpenHelper.getDBInstance(context);
        db = openHelper.getWritableDatabase();
		//开启事务
		db.beginTransaction();
		try{
			db.execSQL("update person set name=? where personid=?",
					    new Object[]{person.getName(),person.getId()});
			db.execSQL("update person set phone=? where personid=?",
				    new Object[]{person.getPhone(),person.getId()});
			//设置事务的标志为成功
			db.setTransactionSuccessful();
		}finally{
			//结束事务,默认情况下是回滚事务
			db.endTransaction();
		}
	}
	
}




Person如下:

package cc.domain;

public class Person {
	private Integer id;
	private String name;
	private String phone;
	
	public Person(String name, String phone) {
		this.name = name;
		this.phone = phone;
	}
	public Person(Integer id, String name, String phone) {
		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;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", phone=" + phone + "]";
	}
	
}

main.xml如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="20dip"
    android:paddingRight="20dip"
    android:orientation="vertical"
     >

    <Button
        android:id="@+id/tipButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="SQLite数据库测试"
        android:layout_marginTop="15dip"
        android:clickable="false"
        />
    
     <Button
        android:id="@+id/addButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="添加数据"
        android:layout_marginTop="15dip"
       />
     
      <Button
        android:id="@+id/queryButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="查找数据"
        android:layout_marginTop="15dip"
       />
      
        <Button
        android:id="@+id/updateButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="更新数据"
        android:layout_marginTop="15dip"
       />
        
        <Button
        android:id="@+id/deleteButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="删除数据"
        android:layout_marginTop="15dip"
       />
        
         <Button
        android:id="@+id/countButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="统计数据"
        android:layout_marginTop="15dip"
       />
       
         <Button
        android:id="@+id/pageButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="数据分页"
        android:layout_marginTop="15dip"
       />
         
         <Button
        android:id="@+id/transactionButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="事务操作"
        android:layout_marginTop="15dip"
       />

</LinearLayout>


相关文章
|
13天前
|
存储 SQL 数据库
数据库知识:了解SQLite或其他移动端数据库的使用
【10月更文挑战第22天】本文介绍了SQLite在移动应用开发中的应用,包括其优势、如何在Android中集成SQLite、基本的数据库操作(增删改查)、并发访问和事务处理等。通过示例代码,帮助开发者更好地理解和使用SQLite。此外,还提到了其他移动端数据库的选择。
21 8
|
24天前
|
Web App开发 SQL 数据库
使用 Python 解析火狐浏览器的 SQLite3 数据库
本文介绍如何使用 Python 解析火狐浏览器的 SQLite3 数据库,包括书签、历史记录和下载记录等。通过安装 Python 和 SQLite3,定位火狐数据库文件路径,编写 Python 脚本连接数据库并执行 SQL 查询,最终输出最近访问的网站历史记录。
|
1月前
|
存储 关系型数据库 数据库
轻量级数据库的利器:Python 及其内置 SQLite 简介
轻量级数据库的利器:Python 及其内置 SQLite 简介
|
1月前
|
应用服务中间件 PHP Apache
PbootCMS提示错误信息“未检测到您服务器环境的sqlite3数据库扩展...”
PbootCMS提示错误信息“未检测到您服务器环境的sqlite3数据库扩展...”
|
16天前
|
NoSQL 前端开发 MongoDB
前端的全栈之路Meteor篇(三):运行在浏览器端的NoSQL数据库副本-MiniMongo介绍及其前后端数据实时同步示例
MiniMongo 是 Meteor 框架中的客户端数据库组件,模拟了 MongoDB 的核心功能,允许前端开发者使用类似 MongoDB 的 API 进行数据操作。通过 Meteor 的数据同步机制,MiniMongo 与服务器端的 MongoDB 实现实时数据同步,确保数据一致性,支持发布/订阅模型和响应式数据源,适用于实时聊天、项目管理和协作工具等应用场景。
|
2月前
|
存储 API 数据库
QML使用Sqlite数据库存储ListModel数据
本文介绍了在QML中使用Sqlite数据库存储ListModel数据的方法,包括如何创建数据库、读取数据、动态添加和删除数据,以及如何在程序启动和退出时与数据库同步数据。
|
2月前
|
数据库 数据库管理
qt对sqlite数据库多线程的操作
本文总结了在Qt中进行SQLite数据库多线程操作时应注意的四个关键问题,包括数据库驱动加载、加锁、数据库的打开与关闭,以及QsqlQuery变量的使用。
113 1
|
23天前
|
存储 缓存 关系型数据库
sqlite 数据库 介绍
sqlite 数据库 介绍
35 0
|
3月前
|
人工智能 小程序 Java
【工具】轻松解锁SQLite数据库,一窥微信聊天记录小秘密
本文介绍了一款名为PyWxDump的开源工具,它可以获取微信账户信息、解密SQLite数据库以查看和备份聊天记录。此工具适用于已登录电脑版微信的用户,通过GitHub下载后简单几步即可操作。适合对数据恢复感兴趣的开发者,但请注意合法合规使用并尊重隐私。
427 2
【工具】轻松解锁SQLite数据库,一窥微信聊天记录小秘密
|
2月前
|
JSON NoSQL 数据库
和SQLite数据库对应的NoSQL数据库:TinyDB的详细使用(python3经典编程案例)
该文章详细介绍了TinyDB这一轻量级NoSQL数据库的使用方法,包括如何在Python3环境中安装、创建数据库、插入数据、查询、更新以及删除记录等操作,并提供了多个编程案例。
101 0

热门文章

最新文章