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

时间:2022-10-20 20:50:51

文章参考地: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<People> queryAll(String tableName) {
List<People> list = new ArrayList<People>();
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<Map<String, Object>> 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<Map<String, Object>>();

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<People> 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<String, Object> item = new HashMap<String, Object>();
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