AndroidSqlite增删改查的基本使用带工具类

文章参考地:http://blog.csdn.net/codeeer/article/details/30237597/

一.SQLite的介绍

1.SQLite简介

SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入  式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持 Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、PHP、Java、C++、.Net等,还有ODBC接口,同样比起 Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。

2.SQLite的特点:


  • 轻量级


SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态  库,就可以享受它的全部功能。而且那个动态库的尺寸也挺小,以版本3.6.11为例,Windows下487KB、Linux下347KB。


  • 不需要"安装"


SQLite的核心引擎本身不依赖第三方的软件,使用它也不需要"安装"。有点类似那种绿色软件。


  • 单一文件  


数据库中所有的信息(比如表、视图等)都包含在一个文件内。这个文件可以自由复制到其它目录或其它机器上。


  • 跨平台/可移植性


除了主流操作系统 windows,linux之后,SQLite还支持其它一些不常用的操作系统。


  • 弱类型的字段


同一列中的数据可以是不同类型


  • 开源


这个相信大家都懂的!!!!!!!!!!!!

3.SQLite数据类型

一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种常用的数据类型:

NULL: 这个值为空值

VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。

CHAR(n):长度固定为n的字串,n不能超过 254。

INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.

REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.

TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).

BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改  变格式。

DATA :包含了 年份、月份、日期。

TIME: 包含了 小时、分钟、秒。

相信学过数据库的童鞋对这些数据类型都不陌生的!!!!!!!!!!

二.SQLiteDatabase的介绍

Android提供了创建和是用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法。在Android的SDK目录下有sqlite3工具,我们可以利用它创建数据库、创建表和执行一些SQL语句。下面是SQLiteDatabase的常用方法。 

SQLiteDatabase的常用方法 
方法名称
方法表示含义
openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory  factory)
打开或创建数据库
insert(String table,String nullColumnHack,ContentValues  values)
插入一条记录
delete(String table,String whereClause,String[]  whereArgs)
删除一条记录
query(String table,String[] columns,String selection,String[]  selectionArgs,String groupBy,String having,String  orderBy)
查询一条记录
update(String table,ContentValues values,String whereClause,String[]  whereArgs)
修改记录
execSQL(String sql)
执行一条SQL语句
close()
关闭数据库

Google公司命名这些方法的名称都是非常形象的。例如openOrCreateDatabase,我们从字面英文含义就能看出这是个打开或创建数据库的方法。


三.SQLiteDatabase事务处理的介绍

为什么需要引入事务处理?

应用程序初始化时需要批量的向sqlite中插入大量数据,单独的使用for循环和Insert方法插入数据导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。我的应用初始1000条记录也就是要1000次读写磁盘操作。
而且不能保证所有数据都能同时插入。(有可能部分插入成功,另外一部分失败)
解决办法:
添加事务处理,把1000条插入作为一个事务

 

 db.beginTransaction();  //手动设置开始事务
        try{
            //批量处理操作
            for(int i=0;i<1001;i++){
                insert(...);
            }
            db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交
           }catch(Exception e){
           }finally{
               db.endTransaction(); //处理完成
           }

四.SQLiteDatabase报异常的介绍

SQLiteException: database is locked异常的解决办法


SQLite实质上是将数据写入一个文件,通常情况下,在应用的包名下面都能找到xxx.db的文件,拥有root权限的手机,可以通过adb shell,看到data/data/packagename/databases/xxx.db这样的文件。我们可以得知SQLite是文件级别的锁:多个线程可以同时读,但是同时只能有一个线程写。Android提供了SqliteOpenHelper类,加入Java的锁机制以便调用。如果多线程同时读写(这里的指不同的线程用使用的是不同的Helper实例),后面的就会遇到android.database.sqlite.SQLiteException: database is locked这样的异常。对于这样的问题,解决的办法就是keep single sqlite connection,保持单个SqliteOpenHelper实例,同时对所有数据库操作的方法添加synchronized关键字。完美解决sqlite的 database locked 或者是 error 5: database locked 问题

五.代码展示
工具类使用:

package com.example.android.datebase;

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.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log;
import android.widget.Toast;

public class DatabaseUtil {

	/*
	 * 我们可以得知SQLite是文件级别的锁:多个线程可以同时读,但是同时只能有一个线程写。Android提供了SqliteOpenHelper类,
	 * 加入Java的锁机制以便调用。如果多线程同时读写(这里的指不同的线程用使用的是不同的Helper实例),后面的就会遇到android.
	 * database.sqlite.SQLiteException: database is
	 * locked这样的异常。对于这样的问题,解决的办法就是keep single sqlite
	 * connection,保持单个SqliteOpenHelper实例,同时对所有数据库操作的方法添加synchronized关键字。
	 * 完美解决sqlite的 database locked 或者是 error 5: database locked 问题
	 */
	public SQLiteDatabase db;

//	public DatabaseUtil(Context context) {
//		SqliteDataBaseClass dataBase = new SqliteDataBaseClass(context);
//		db = dataBase.getReadableDatabase();
//	}
	public DatabaseUtil(Context context, String name, CursorFactory factory, int version) {
		SqliteDataBaseClass dataBase = new SqliteDataBaseClass(context, name,factory, version);
		db = dataBase.getReadableDatabase();
	}
	// 插入一条数据
	public synchronized void insert(String table, String nullColumnHack, ContentValues values) {
		db.insert(table, nullColumnHack, values);
	}

	// 删除一条数据
	public synchronized void delete(String table, String whereClause, String[] whereArgs) {
		db.delete(table, whereClause, whereArgs);
	}

	// 更新一条数据
	public synchronized void update(String table, ContentValues values, String whereClause, String[] whereArgs) {
		db.update(table, values, whereClause, whereArgs);
	}

	// 查询数据
	public synchronized List queryAll(String tableName) {
		List list = new ArrayList();
		Cursor cursor = db.query(tableName, null, null, null, null, null, null);

		while (cursor.moveToNext()) {
			People person = new People();
			person.setUsername(cursor.getString(cursor.getColumnIndex("username")));
			person.setDevice_name(cursor.getString(cursor.getColumnIndex("device_name")));
			person.setDevice_id(cursor.getInt(cursor.getColumnIndex("device_id")));
			person.setDate(cursor.getString(cursor.getColumnIndex("auto_data")));
			person.setTime(cursor.getString(cursor.getColumnIndex("auto_time")));
			list.add(person);
		}
		return list;
	}

	public synchronized void close() {
		if (db != null) {
			db.close();
		}
	};
}

基本的增删改查:

package com.example.androidconnectmysql;

import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.example.android.datebase.DatabaseUtil;
import com.example.android.datebase.People;

import android.app.Activity;
import android.content.ContentValues;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

	private Button btn_add, btn_delete, btn_update, btn_quest,btn4;
	private EditText et_add_user, et_add_device, et_add_id, et_add_date, et_add_time;
	private TextView tv1, tv2, tv3, tv4, tv5;
	private ListView lv;
	private SimpleAdapter adapter;
	private List> list1;
	private int version=1;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		btn_add = (Button) findViewById(R.id.btn_add);
		btn_delete = (Button) findViewById(R.id.button1);
		btn_update = (Button) findViewById(R.id.button2);
		btn_quest = (Button) findViewById(R.id.button3);
		btn4=(Button) findViewById(R.id.button4);
		tv1 = (TextView) findViewById(R.id.textView1);
		tv2 = (TextView) findViewById(R.id.textView2);
		tv3 = (TextView) findViewById(R.id.textView3);
		tv4 = (TextView) findViewById(R.id.textView4);
		tv5 = (TextView) findViewById(R.id.textView5);
		lv = (ListView) findViewById(R.id.listview);
		list1 = new ArrayList>();

		et_add_user = (EditText) findViewById(R.id.edit_add_username);
		et_add_device = (EditText) findViewById(R.id.edit_add_devicename);
		et_add_id = (EditText) findViewById(R.id.edit_add_deviceid);
		et_add_date = (EditText) findViewById(R.id.edit_add_date);
		et_add_time = (EditText) findViewById(R.id.edit_add_time);
		btn_add.setOnClickListener(this);
		btn_delete.setOnClickListener(this);
		btn_update.setOnClickListener(this);
		btn_quest.setOnClickListener(this);
//		btn4.setOnClickListener(new OnClickListener() {
//			
//			@Override
//			public void onClick(View v) {
//				//升级数据库
//				DatabaseUtil util =new DatabaseUtil(MainActivity.this, "Data", null, version);
//				util.close();
//			}
//		});
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_add:
			DatabaseUtil data = new DatabaseUtil(MainActivity.this, "Data", null, version);
			ContentValues values = new ContentValues();
			// 开启事务
			data.db.beginTransaction();
			try {

//				for (int i = 0; i < 1000; i++) {
					values.put("username", et_add_user.getText().toString());
					values.put("device_name", et_add_device.getText().toString());
					values.put("device_id", et_add_id.getText().toString());
					values.put("auto_data", et_add_date.getText().toString());
					values.put("auto_time", et_add_time.getText().toString());
					data.insert("device_managent", null, values);

//				}
				// 设置事务标志为成功,当结束事务时就会提交事务
				data.db.setTransactionSuccessful();
			} catch (Exception e) {
				// TODO: handle exception
			} finally {
				// 结束事务
				data.db.endTransaction();
				data.close();
			}
			Toast.makeText(MainActivity.this, "插入成功", Toast.LENGTH_SHORT).show();
			break;
		case R.id.button1:
			DatabaseUtil data1 = new DatabaseUtil(MainActivity.this, "Data", null, version);
			String user = "username=?";
			String[] shuzu = new String[] { "username" };
			data1.delete("device_managent", user, shuzu);
			data1.close();
			Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
			break;
		case R.id.button2:
			DatabaseUtil data2 = new DatabaseUtil(MainActivity.this, "Data", null, version);
			ContentValues values1 = new ContentValues();
			values1.put("username", "121315456");
			values1.put("device_name", "121eqweqw315456");
			values1.put("device_id", 2222222);
			values1.put("auto_data", "2000-11-22");
			values1.put("auto_time", "12:00");
			String user1 = "username=?";
			String[] shuzu1 = new String[] { "username" };
			data2.update("device_managent", values1, user1, shuzu1);
			data2.close();
			Toast.makeText(MainActivity.this, "修改成功", Toast.LENGTH_SHORT).show();
			break;
		case R.id.button3:
			list1.clear();
			DatabaseUtil data3 = new DatabaseUtil(MainActivity.this, "Data", null, version);
			List list = data3.queryAll("device_managent");

			for (int i = 0; i < list.size(); i++) {
				String name = list.get(i).getUsername();
				String device_name = list.get(i).getDevice_name();
				int id = list.get(i).getDevice_id();
				String date = list.get(i).getDate();
				String time = list.get(i).getTime();
				Map item = new HashMap();
				item.put("username", "username:" + name);
				item.put("device_name", "device_name:" + device_name);
				item.put("device_id", "device_id:" + id);
				item.put("date", "date:" + date);
				item.put("time", "time:" + time);
				list1.add(item);

			}
			adapter = new SimpleAdapter(MainActivity.this, list1, R.layout.listitem,
					new String[] { "username", "device_name", "device_id", "date", "time" },
					new int[] { R.id.textView1, R.id.textView2, R.id.textView3, R.id.textView4, R.id.textView5 });
			lv.setAdapter(adapter);
			data3.close();
			Toast.makeText(MainActivity.this, "查找成功", Toast.LENGTH_SHORT).show();
			break;
		default:
			break;
		}
	}

}


六.代码下载地址:

http://download.csdn.net/detail/qq_31546677/9798777



你可能感兴趣的:(AndroidSqlite增删改查的基本使用带工具类)