Android 操作SQLite 详解

一、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()关闭数据库

1、打开或者创建数据库

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

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

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

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

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

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

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

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

}

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


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

4、删除数据
删除数据也有两种方法:
①调用SQLiteDatabase的delete(String table,String whereClause,String[]  whereArgs)方法
参数1  表名称 
参数2  删除条件
参数3  删除条件值数组
②编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除。
例如:

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

5、修改数据

修改数据有两种方法:

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

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


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

}

 

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来查询数据库中的数据,具体代码如下:


private void query(SQLiteDatabase db) {  
//查询获得游标  
Cursor cursor = db.query ("test_db",null,null,null,null,null,null);  
   
//判断游标是否为空  
if(cursor.moveToFirst() {  
//遍历游标  
for(int i=0;i<cursor.getCount();i++){  
cursor.move(i);  
//获得ID  
int id = cursor.getInt(0);  
//获得用户名  
String username=cursor.getString(1);  
//获得密码  
String password=cursor.getString(2);  
//输出用户信息 System.out.println(id+":"+sname+":"+snumber);  
}  
}  

}

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

private void drop(SQLiteDatabase db){  
//删除表的SQL语句  
String sql ="DROP TABLE test_db";  
//执行SQL  
db.execSQL(sql);  
}

 

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

1.onCreate(SQLiteDatabase)

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

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

3.  onOpen(SQLiteDatabase):

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

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

SQLiteActivity

 

import com.example.administrator.myapplication.R;

/**
 * Created by Administrator on 2020/4/25.
 */

public class SQLiteActivity extends AppCompatActivity implements View.OnClickListener {
    //声明五个控件对象
    private Button createDatabase ,updateDatabase,insert,update,query,delete;
    DataBaseHelper dataBaseHelper;
    SQLiteDatabase db1 ;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sq_layout);
         dataBaseHelper = new DataBaseHelper(SQLiteActivity.this,"test_db");
         db1 = dataBaseHelper.getWritableDatabase();
        initView();
    }

    /**
     * 初始化
     */
    private void initView(){
        createDatabase = findViewById(R.id.createDatabase);
        updateDatabase = findViewById(R.id.updateDatabase);
        insert = findViewById(R.id.insert);
        update = findViewById(R.id.update);
        query = findViewById(R.id.query);
        delete = findViewById(R.id.delete);

        createDatabase.setOnClickListener(this);
        updateDatabase.setOnClickListener(this);
        insert.setOnClickListener(this);
        update.setOnClickListener(this);
        query.setOnClickListener(this);
        delete.setOnClickListener(this);
    }
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.createDatabase:
            case R.id.updateDatabase:
                //创建一个DatabaseHelper对象
                SQLiteDatabase db = dataBaseHelper.getReadableDatabase();
                break;
            case R.id.insert:
                ContentValues values = new ContentValues();
                values.put("id",1);
                values.put("sname","xxx");
                values.put("sage",20);
                values.put("sex",12);
 //                db1.insert("user",null,values);
                String sql = "insert into test_db(id,sname,sage,sex) values(1,'xxx',20,12)";
                db1.execSQL(sql);
                break;
            case R.id.update:
//                ContentValues values1 = new ContentValues();
//                values1.put("name", "xiaosan");
//                db1.update("user", values1, "id=?", new String[]{"1"});
                String sql1 = "update test_db set sname = 'djp' where id = 1";
                db1.execSQL(sql1);
                break;
            case R.id.query:
                /*
                * //参数1:表名
            //参数2:要想显示的列
            //参数3:where子句
            //参数4:where子句对应的条件值
            //参数5:分组方式
            //参数6:having条件
            //参数7:排序方式
                * */
                Cursor cursor = db1.query("test_db",new String[]{"id","sname","sage","ssex"},null,
                        null,null,null,null);
                while (cursor.moveToNext()){
                    String name = cursor.getString(cursor.getColumnIndex("sname"));
                    String age = cursor.getString(cursor.getColumnIndex("sage"));
                    String sex = cursor.getString(cursor.getColumnIndex("ssex"));

                }
                db1.close();
                break;
            case R.id.delete:
                String sql2 = "delect from test_db where id =1";
                db1.execSQL(sql2);
                break;
        }

    }
}
DataBaseHelper
package com.example.administrator.myapplication.recle.sqlite;

import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * Created by Administrator on 2020/4/25.
 * 数据库创建
 */

public class DataBaseHelper extends SQLiteOpenHelper {
    private static final int VERSION = 1;
    private static final String SWORD="SWORD";
    //带全部参数的构造函数,此构造函数必不可少
    public DataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }
    //带两个参数的构造函数,调用的其实是带三个参数的构造函数
    public DataBaseHelper(Context context,String name){
      super(context, name,null,VERSION);
   }
    public DataBaseHelper(Context context,String name,int version){
        super(context, name,null,version);

    }

    /*
    * 创建数据库
    * */
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String sql = "Create table user(id integer PRIMARY KEY AUTOINCREMNET ,sname varcher(20),sage int,sex varcher(10))";
        Log.e("TAG", "onCreate:------------ " );
        sqLiteDatabase.execSQL(sql);
    }
    /*
    * 数据库更新
    * */
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        Log.e("TAG", "onUpgrade:------------ " );
    }


}

main.xml 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/createDatabase"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/createDatabse"/>
    <Button
        android:id="@+id/updateDatabase"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/updateDatabase"/>
    <Button
        android:id="@+id/insert"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/insert"/>
    <Button
        android:id="@+id/update"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/update"/>
    <Button
        android:id="@+id/query"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/query"/>
    <Button
        android:id="@+id/delete"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/sql_delete"/>




</LinearLayout>

 结尾!!!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值