文章参考地: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
六.代码下载地址:
http://download.csdn.net/detail/qq_31546677/9798777