Android之操作SQLite

一.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,我们从字面英文含义就能看出这是个打开或创建数据库的方法。

1、打开或者创建数据库

在Android 中使用SQLiteDatabase的静态方法openOrCreateDatabase(String  path,SQLiteDatabae.CursorFactory  factory)打开或者创建一个数据库。它会自动去检测是否存在这个数据库,如果存在则打开,不存在则创建一个数据库;创建成功则返回一个SQLiteDatabase对象,否则抛出异常FileNotFoundException。

下面是创建名为“stu.db”数据库的代码:
openOrCreateDatabase(String  path,SQLiteDatabae.CursorFactory  factory)
参数1  数据库创建的路径

参数2  一般设置为null就可以了

[sql] view plain copy

print?

  1. db=SQLiteDatabase.openOrCreateDatabase("/data/data/com.lingdududu.db/databases/stu.db",null);

2、创建表

创建一张表的步骤很简单:

  • 编写创建表的SQL语句
  • 调用SQLiteDatabase的execSQL()方法来执行SQL语句

下面的代码创建了一张用户表,属性列为:id(主键并且自动增加)、sname(学生姓名)、snumber(学号)

[sql] view plain copy

print?

  1. private void createTable(SQLiteDatabase db){
  2. //创建表SQL语句
  3. String stu_table="create table usertable(_id integer primary key autoincrement,sname text,snumber text)";
  4. //执行SQL语句
  5. db.execSQL(stu_table);
  6. }

3、插入数据
插入数据有两种方法:
①SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues  values)方法,
  参数1  表名称,
  参数2  空列的默认值
  参数3  ContentValues类型的一个封装了列名称和列值的Map;
②编写插入数据的SQL语句,直接调用SQLiteDatabase的execSQL()方法来执行
第一种方法的代码:

[sql] view plain copy

print?

  1. private void insert(SQLiteDatabase db){
  2. //实例化常量值
  3. ContentValues cValue = new ContentValues();
  4. //添加用户名
  5. cValue.put("sname","xiaoming");
  6. //添加密码
  7. cValue.put("snumber","01005");
  8. //调用insert()方法插入数据
  9. db.insert("stu_table",null,cValue);
  10. }

第二种方法的代码:

[sql] view plain copy

print?

  1. private void insert(SQLiteDatabase db){
  2. //插入数据SQL语句
  3. String stu_sql="insert into stu_table(sname,snumber) values(‘xiaoming‘,‘01005‘)";
  4. //执行SQL语句
  5. db.execSQL(sql);
  6. }

4、删除数据

删除数据也有两种方法:

①调用SQLiteDatabase的delete(String table,String whereClause,String[]  whereArgs)方法
参数1  表名称 
参数2  删除条件
参数3  删除条件值数组

②编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除。

第一种方法的代码:

[sql] view plain copy

print?

  1. private void delete(SQLiteDatabase db) {
  2. //删除条件
  3. String whereClause = "id=?";
  4. //删除条件参数
  5. String[] whereArgs = {String.valueOf(2)};
  6. //执行删除
  7. db.delete("stu_table",whereClause,whereArgs);
  8. }

第二种方法的代码:

[sql] view plain copy

print?

  1. private void delete(SQLiteDatabase db) {
  2. //删除SQL语句
  3. String sql = "delete from stu_table where _id = 6";
  4. //执行SQL语句
  5. db.execSQL(sql);
  6. }

5、修改数据

修改数据有两种方法:

①调用SQLiteDatabase的update(String table,ContentValues values,String  whereClause, String[]  whereArgs)方法
参数1  表名称
参数2  跟行列ContentValues类型的键值对Key-Value
参数3  更新条件(where字句)
参数4  更新条件数组

②编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新。

第一种方法的代码:

[sql] view plain copy

print?

  1. private void update(SQLiteDatabase db) {
  2. //实例化内容值 ContentValues values = new ContentValues();
  3. //在values中添加内容
  4. values.put("snumber","101003");
  5. //修改条件
  6. String whereClause = "id=?";
  7. //修改添加参数
  8. String[] whereArgs={String.valuesOf(1)};
  9. //修改
  10. db.update("usertable",values,whereClause,whereArgs);
  11. }

第二种方法的代码:

[sql] view plain copy

print?

  1. private void update(SQLiteDatabase db){
  2. //修改SQL语句
  3. String sql = "update stu_table set snumber = 654321 where id = 1";
  4. //执行SQL
  5. db.execSQL(sql);
  6. }

6、查询数据

在Android中查询数据是通过Cursor类来实现的,当我们使用SQLiteDatabase.query()方法时,会得到一个Cursor对象,Cursor指向的就是每一条数据。它提供了很多有关查询的方法,具体方法如下:

public  Cursor query(String table,String[] columns,String selection,String[]  selectionArgs,String groupBy,String having,String orderBy,String limit);

各个参数的意义说明:

参数table:表名称

参数columns:列名称数组

参数selection:条件字句,相当于where

参数selectionArgs:条件字句,参数数组

参数groupBy:分组列

参数having:分组条件

参数orderBy:排序列

参数limit:分页查询限制

参数Cursor:返回值,相当于结果集ResultSet

Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.

Cursor游标常用方法


方法名称

方法描述

getCount()

获得总的数据项数

isFirst()

判断是否第一条记录

isLast()

判断是否最后一条记录

moveToFirst()

移动到第一条记录

moveToLast()

移动到最后一条记录

move(int offset)

移动到指定记录

moveToNext()

移动到下一条记录

moveToPrevious()

移动到上一条记录

getColumnIndexOrThrow(String  columnName)

根据列名称获得列索引

getInt(int columnIndex)

获得指定列索引的int类型值

getString(int columnIndex)

获得指定列缩影的String类型值

下面就是用Cursor来查询数据库中的数据,具体代码如下:

[sql] view plain copy

print?

  1. private void query(SQLiteDatabase db) {
  2. //查询获得游标
  3. Cursor cursor = db.query ("usertable",null,null,null,null,null,null);
  4. //判断游标是否为空
  5. if(cursor.moveToFirst() {
  6. //遍历游标
  7. for(int i=0;i<cursor.getCount();i++){
  8. cursor.move(i);
  9. //获得ID
  10. int id = cursor.getInt(0);
  11. //获得用户名
  12. String username=cursor.getString(1);
  13. //获得密码
  14. String password=cursor.getString(2);
  15. //输出用户信息 System.out.println(id+":"+sname+":"+snumber);
  16. }
  17. }
  18. }

7、删除指定表
编写插入数据的SQL语句,直接调用SQLiteDatabase的execSQL()方法来执行

[java] view plain copy

print?

  1. private void drop(SQLiteDatabase db){
  2. //删除表的SQL语句
  3. String sql ="DROP TABLE stu_table";
  4. //执行SQL
  5. db.execSQL(sql);
  6. }

三. SQLiteOpenHelper
该类是SQLiteDatabase一个辅助类。这个类主要生成一  个数据库,并对数据库的版本进行管理。当在程序当中调用这个类的方法getWritableDatabase()或者 getReadableDatabase()方法的时候,如果当时没有数据,那么Android系统就会自动生成一个数据库。 SQLiteOpenHelper 是一个抽象类,我们通常需要继承它,并且实现里面的3个函数:

1.onCreate(SQLiteDatabase)

在数据库第一次生成的时候会调用这个方法,也就是说,只有在创建数据库的时候才会调用,当然也有一些其它的情况,一般我们在这个方法里边生成数据库表。

2.  onUpgrade(SQLiteDatabase,int,int) 
当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据表,并建立新的数据表,当然是否还需要做其他的操作,完全取决于应用的需求。

3.  onOpen(SQLiteDatabase):

这是当打开数据库时的回调函数,一般在程序中不是很常使用。

写了这么多,改用用实际例子来说明上面的内容了。下面这个操作数据库的实例实现了创建数据库,创建表以及数据库的增删改查的操作。

package mars.sqlite3;

import mars.sqlite3.db.DatabaseHelper;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class SQLiteActivity extends Activity {
    /** Called when the activity is first created. */
    private Button createButton;
    private Button insertButton;
    private Button updateButton;
    private Button updateRecordButton;
    private Button queryButton;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        createButton = (Button)findViewById(R.id.createDatabase);
        updateButton = (Button)findViewById(R.id.updateDatabase);
        insertButton = (Button)findViewById(R.id.insert);
        updateRecordButton = (Button)findViewById(R.id.update);
        queryButton = (Button)findViewById(R.id.query);
        createButton.setOnClickListener(new CreateListener());
        updateButton.setOnClickListener(new UpdateListener());
        insertButton.setOnClickListener(new InsertListener());
        updateRecordButton.setOnClickListener(new UpdateRecordListener());
        queryButton.setOnClickListener(new QueryListener());
    }
    class CreateListener implements OnClickListener{
        @Override
        public void onClick(View v) {
            //创建一个DatabaseHelper对象
            DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");
            //只有调用了DatabaseHelper对象的getReadableDatabase()方法,或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库
            SQLiteDatabase db = dbHelper.getReadableDatabase();
        }
    }
    class UpdateListener implements OnClickListener{

        @Override
        public void onClick(View v) {
            DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db",2);
            SQLiteDatabase db = dbHelper.getReadableDatabase();
        }

    }
    class InsertListener implements OnClickListener{

        @Override
        public void onClick(View v) {
            //生成ContentValues对象
            ContentValues values = new ContentValues();
            //想该对象当中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致
            values.put("id", 1);
            values.put("name","zhangsan");
            DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db",2);
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            //调用insert方法,就可以将数据插入到数据库当中
            db.insert("user", null, values);
        }
    }
    //更新操作就相当于执行SQL语句当中的update语句
    //UPDATE table_name SET XXCOL=XXX WHERE XXCOL=XX...
    class UpdateRecordListener implements OnClickListener{

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            //得到一个可写的SQLiteDatabase对象,这里的version必须为2时才可以,因为刚开始的时候更新为了2,如果为1的话会出现空异常错误
            DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db",2);
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put("name", "zhangsanfeng");
            //第一个参数是要更新的表名
            //第二个参数是一个ContentValeus对象
            //第三个参数是where子句
            db.update("user", values, "id=?", new String[]{"1"});
        }
    }
    class QueryListener implements OnClickListener{

        @Override
        public void onClick(View v) {
            System.out.println("aaa------------------");
            Log.d("myDebug", "myFirstDebugMsg");

            //以下是出错的代码
            DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db",2);
            SQLiteDatabase db = dbHelper.getReadableDatabase();

            //参数1:表名
            //参数2:要想显示的列
            //参数3:where子句
            //参数4:where子句对应的条件值
            //参数5:分组方式
            //参数6:having条件
            //参数7:排序方式
            Cursor cursor = db.query("user", new String[]{"id","name"}, "id=?", new String[]{"1"}, null, null, null);
            while(cursor.moveToNext()){
                String name = cursor.getString(cursor.getColumnIndex("name"));
                System.out.println("query--->" + name);
            }
            db.close();
        }
    }

}
package mars.sqlite3.db;

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

//DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能,
//第一,getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatabse对象,通过该对象可以对数据库进行操作
//第二,提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final int VERSION = 1;
    //在SQLiteOepnHelper的子类当中,必须有该构造函数
    public DatabaseHelper(Context context, String name, CursorFactory factory,
            int version) {
        //必须通过super调用父类当中的构造函数
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub
    }
    public DatabaseHelper(Context context,String name){
        this(context,name,VERSION);
    }
    public DatabaseHelper(Context context,String name,int version){
        this(context, name,null,version);
    }

    //该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDatabse对象的时候,才会调用这个方法
    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        System.out.println("create a Database");
        //execSQL函数用于执行SQL语句
        db.execSQL("create table user(id int,name varchar(20))");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        System.out.println("update a Database");
    }

}

main.xml写界面

参考:http://www.cnblogs.com/bingbingliang-xiaomonv/p/5472901.html

http://blog.csdn.net/codeeer/article/details/30237597

时间: 2024-11-02 07:11:34

Android之操作SQLite的相关文章

无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.demo1" /> 上面targetPackage指定的包要和应用的package相同. (2)在清单文件中ap

Android多线程操作sqlite(Sqlite解决database locked问题)

参考http://blog.csdn.net/sdsxleon/article/details/18259973  很好 https://github.com/2point0/Android-Database-Locking-Collisions-Example 示例 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=333473 http://bbs.51cto.com/thread-990260-1.html 用事务,速度会很会 方

Android 操作SQLite基本用法

在Android开发中SQLite起着很重要的作用,网上SQLite的教程有很多很多,不过那些教程大多数都讲得不是很全面.本人总结了一些SQLite的常用的方法,借着论坛的大赛,跟大家分享分享的. 一.SQLite的介绍 1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入  式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持 Windows/Linux/Unix等等

android操作sqlite数据库及心得

写这篇文章主要是网上的对sqlite的操作太多且太杂,很多时候都不能很好的运用到自己的项目中,结构不清晰,我自己写了一篇适合刚刚接触的人看的操作方法. 近来用android时要将一些数据保存起来,一开始用的是preferences,后来要保存的东西多了,发现用preferences明显不能满足要求了,而且发现用这个的话代码就变得有点乱了,所以才开始学习使用sqlite数据库,一开始以为不就是个数据库么,和平时的mysql啊或者是sqlserver都一样,都很简单的,但后来真正在用的时候才发现困难

跟我学Android之十三 SQLite数据库操作

本章内容 第1节  SQLite数据库概述 第2节  SQLite建库建表 第3节 管理数据库连接 第4节  操作数据库数据 第5节  数据绑定 本章目标 掌握SQLite数据的基本特点与工具使用. 熟练掌握SQLite建库建表的方法. 熟练掌握连接SQLite数据库的方法. 熟悉SQLite数据库的升级与建立方法. 掌握通过数据绑定完成数据显示的方法. SQLite数据库简介 SQLite是一种非常流行的嵌入式数据库,是由C语言编写而成,是一款轻型关系型数据库,支持SQL,支持多种操作系统,完

[Android新手区] SQLite 操作详解--SQL语法

该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法  :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解析大部分标准SQL语言.但它也省去了一些特性并且加入了一些自己的新特性.这篇文档就是试图描述那些SQLite支持/不支持的SQL语法的.查看关键字列表. 如下语法表格中,纯文本用蓝色粗体显示.非终极符号为斜体红色.作为语法一部分的运算符用黑色Roman字体表示. 这篇文档只是对SQLite实现的SQ

Android——使用SQLiteDatabase操作SQLite数据库

除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n).char(n).decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型. SQLite最大的特点是

【转】afinal来操作android的数据库sqlite

今天给大家介绍下#afinal#来操作android的数据库sqlite. #afinal#是一个android的orm.ioc快速开发框架,里面包含了四大功能:空间的id绑定和事件绑定功能:网络图片的显示功能(里面包含了强大的缓存框架):数据库sqlite的操作功能:http数据的读取功能(支持ajax方式读取): #afinal#开源网址:https://github.com/yangfuhai/afinal 这篇文章主要是介绍afinal的功能之一FinalDb组件,其他组件请关注我的博客

基础篇:6.Android数据库编程---SQLite

简介: 在Android平台上,继承了一个嵌入式关系型数据库---SQLite.SQLite具有跨平台特性,可以在所有主要的操作系统上运行.SQLite通过独占性和共享锁实现独立事务处理,因此多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据,在进行写操作之前,必须先获得独占锁.另一方面,SQLite采取动态数据类型,当某个值插入数据库时,SQLite会检查它的类型,如果该类型与所关联的列不匹配,SQLite则会进行强制转换.SQLite支持以下几种数据类型:NULL(空值).I