Android数据存储之SQLite数据库

SQLite是一个小巧的嵌入式数据库,使用方便、开发简单,手机上最早由IOS运用,后来Android也采用了SQLite. SQLite的多数SQL语法与Oracle 一样,下面只列出不同的地方:

  (1)建表时为避免重复操作,应加上IF NOT EXISTS关键词,例如CREATE TABLE IF NOT EXISTS table_name

  (2)删表时为避免重复操作,应加上IF EXISTS关键词,例如DROP TABLE IF EXISTS table_name

  (3)添加新列时使用ALTER TABLE table_name ADD COLUMN...,注意比Oracle多了个COLUMN 关键字

  (4)在SQLite中,ALTER语句每次只能添加一列,如果要添加多列,就只能分多次添加

  (5)SQLite支持整型INTEGER、字符串VARCHAR、浮点数FLOAT,但不支持布尔类型。布尔类型数要使用整型保存,如果直接保存布尔数据,在入库时SQLite就会自动将其转为0或1(false,true)

  (6)SQLite 建表时需要一个唯一标识字段,字段名为_ id。 每建一张新表都要例行公事加上该字段定义,具体属性定义为_ id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL

  (7)条件语句等号后面的字符串值要用单引号括起来,如果没用单引号括起来则运行时会报错

SQLiteDatabase是SQLite的数据库管理类,开发者可通过以下代码创建或删除数据库

//创建名叫test.db的数据库(如果不存在就创建它,如果存在就打开它)
SQLiteDatabase db=openOrCreateDatabase(getFilesDir()+"/test.db",Context.MODE_PRIVATE,null);
//删除名为test.db的数据库
deleteDatabase(getFilesDir()+"/test.db");

为了指导开发者进行SQLite的合理使用,Android提供了一个辅助工具一SQLiteOpenHelper, 具体使用步骤如下:

  (1) 新建一个继承自SQLiteOpenHelper的数据库操作类,提示重写onCreate和onUpgrade两个方法。其中,onCreate 方法只在第一次打开数据库时执行,在此可进行表结构创建的操作;onUpgrade方法在数据库版本升高时执行,因此可以在onUpgrade函数内部根据新旧版本号进行表结构变更处理。

  (2) 封装保证数据库安全的必要方法,包括获取单例对象、打开数据库连接、关闭数据库连接。

      (获取单例对象:确保App运行时数据库只被打开一次,避免重复打开引起错误。

       打开数据库连接: SQLite有锁机制,即读锁和写锁的处理;故而数据库连接也分两种,读连接可调用SQLiteOpenHelper的getReadableDatabase 方法获得,写连接可调用getWritableDatabase获得。

       关闭数据库连接: 数据库操作完毕后,应当调用SQLiteDatabase对象的close方法关闭连接。)

  (3) 提供对表记录增删改查的操作方法。

可被SQLite直接使用的数据结构是ContentValues类,类似于映射Map,提供put和get方法用来存取键值对。区别之处在于ContentValues 的键只能是字符串,ContentValues主要用于记录增加和更新操作,即SQLiteDatabase的insert 和update方法。

对于查询操作来说,使用的是另一个游标类Cursor。 调用SQLiteDatabase 的query 和rawQuery方法时,返回的都是Cursor对象,因此获取查询结果要根据游标的指示一条一条遍历结果集合。Cursor的常用方法可分为3类,说明如下:

(1)游标控制类方法,用于指定游标的状态。

  · close: 关闭游标。

  · isClosed: 判断游标是否关闭。

  · isFirst: 判断游标是否在开头。

  · isLast: 判断游标是否在末尾。

(2)游标移动类方法,把游标移动到指定位置。

  · moveToFirst:移动游标到开头。

  · moveToLast: 移动游标到末尾。

  · moveToNext:移动游标到下一条记录。

  · moveToPrevious:移动游标到上一条记录。

  · move: 往后移动游标若干条记录。

  · moveToPosition: 移动游标到指定位置的记录。

(3)获取记录类方法,可获取记录的数量、类型以及取值。

  · getCount:获取结果记录的数量。

  · getInt:获取指定字段的整型值。(getFloat、getString用法类似)

  · getType:获取指定字段的字段类型

由于数据库操作的特殊性,不方便单独演示某个功能,接下来通过用户注册信息数据库的例子来看一下完整代码:

package USER_CLASS;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;

/**
 * Created by animator on 2020/1/18.
 */
public class UserDBHelper extends SQLiteOpenHelper {
    private static final String DB_NAME="user.db";//数据库名称
    private static final int DB_VERSION=1;//数据库版本号
    private static UserDBHelper mHelper=null;//数据库帮助类的示例
    private SQLiteDatabase mDB=null;//数据库的示例
    public final String TABLE_NAME="user_info";//表的名称

    private UserDBHelper(Context context){
        super(context,DB_NAME,null,DB_VERSION);
    }

    private UserDBHelper(Context context,int version){
        super(context,DB_NAME,null,version);
    }

    //利用单例模式获取数据库帮助器的唯一实例
    public static UserDBHelper getInstance(Context context,int version){
        if(version>0&&mHelper==null){
            mHelper=new UserDBHelper(context,version);
        }else if(mHelper==null){
            mHelper=new UserDBHelper(context);
        }
        return mHelper;
    }

    //打开数据库的读连接
    public SQLiteDatabase openReadLink(){
        if(mDB==null||!mDB.isOpen()){
            mDB=mHelper.getReadableDatabase();
        }
        return mDB;
    }
    //打开数据库的写连接
    public SQLiteDatabase openWriteLink(){
        if(mDB==null||!mDB.isOpen()){
            mDB=mHelper.getWritableDatabase();
        }
        return mDB;
    }
    //关闭数据库的连接
    public void closeLink(){
        if(mDB!=null&&mDB.isOpen()){
            mDB.close();
            mDB=null;
        }
    }

    //创建数据库,执行建表语句
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String drop_sql="DROP TABLE IF EIXSTS"+TABLE_NAME+";";
        sqLiteDatabase.execSQL(drop_sql);
        String create_sql="CREATE TABLE IF NOT EXISTS"+TABLE_NAME+"("+
                "_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+
                "name VARCHAR NOT NULL,"+"age INTEGER NOT NULL,"+
                "height LONG NOT NULL,"+"weight FLOAT NOT NULL,"+
                "married INTEGER NOT NULL,"+"update_time VARCHAR NOT NULL,"+
                "phone VARCHAR,"+"password VARCHAR"+");";
        sqLiteDatabase.execSQL(create_sql);
    }

    //修改数据库,执行表结构变更语句
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }

    //根据指定条件删除表记录
    public int delete(String condition){
        //执行删除记录动作,该语句返回删除记录的数目
        return mDB.delete(TABLE_NAME,condition,null);
    }

    //往该表中添加多条记录
    public long insert(ArrayList<UserInfo> infoArray){
        long result=-1;
        for(int i=0;i<infoArray.size();i++){
            UserInfo info=infoArray.get(i);
            ArrayList<UserInfo> tempArray=new ArrayList<UserInfo>();
            //如果存在同样的手机号码,则更新记录
            //注意条件语句的等号后面要用单引号括起来
            if(info.phone!=null&&info.phone.length()>0){
                String condition=String.format("phone=‘%s‘",info.phone);
                tempArray=query(condition);
                if(tempArray.size()>0){
                    update(info,condition);
                    result=tempArray.get(0).rowid;
                    continue;
                }
            }
            //不存在唯一性重复的记录,则插入新记录
            ContentValues cv=new ContentValues();
            cv.put("name",info.name);
            cv.put("age",info.age);
            cv.put("height",info.height);
            cv.put("weight",info.weight);
            cv.put("married",info.married);
            cv.put("update_time",info.update_time);
            cv.put("phone",info.phone);
            cv.put("password",info.password);
            //执行插入记录的动作,该语句返回插入记录的行号
            result=mDB.insert(TABLE_NAME,"",cv);
            //添加成功后返回行号,失败后返回-1
            if(result==-1)
                return result;
        }
        return result;
    }

    //根据条件更新指定的表记录
    public int update(UserInfo info,String condition){
        ContentValues cv=new ContentValues();
        cv.put("name",info.name);
        cv.put("age",info.age);
        cv.put("height",info.height);
        cv.put("weight",info.weight);
        cv.put("married",info.married);
        cv.put("update_time",info.update_time);
        cv.put("phone",info.phone);
        cv.put("password",info.password);
        //执行更新记录动作,该语句返回记录更新的数目
        return mDB.update(TABLE_NAME,cv,condition,null);
    }

    //根据指定条件查询记录,并返回结果数据队列
    public ArrayList<UserInfo> query(String condition){
        String sql=String.format("select rowid,_id,name,age,height,weight,married,update_time,phone,password from %s where %s",TABLE_NAME,condition);
        ArrayList<UserInfo> infoArray=new ArrayList<UserInfo>();
        //执行记录查询动作,该语句返回结果集的游标
        Cursor cursor=mDB.rawQuery(sql,null);
        //循环取出游标指向的每条记录
        while(cursor.moveToNext()){
            UserInfo info=new UserInfo();
            info.rowid=cursor.getLong(0);
            info.xuhao=cursor.getInt(1);
            info.name=cursor.getString(2);
            info.age=cursor.getInt(3);
            info.height=cursor.getLong(4);
            info.weight=cursor.getFloat(5);
            //SQLite没有boolean型,用0表示false用1表示true
            info.married=(cursor.getInt(6)==0)?false:true;
            info.update_time=cursor.getString(7);
            info.phone=cursor.getString(8);
            info.password=cursor.getString(9);
            infoArray.add(info);
        }
        cursor.close();
        return infoArray;
    }

    //根据手机号码查询指定记录
    public UserInfo queryByPhone(String phone){
        UserInfo info=null;
        ArrayList<UserInfo> infoArray= query(String.format("phone=‘%s‘",phone));
        if(infoArray.size()>0){
            info=infoArray.get(0);
        }
        return info;
    }
}

原文地址:https://www.cnblogs.com/zdm-code/p/12210603.html

时间: 2024-11-08 16:26:04

Android数据存储之SQLite数据库的相关文章

Android数据存储引擎---SQLite数据库

目标:是否可以在PC端桌面上使用SQLite数据库制作一个财务文件? 目录: 来源: 实践: 总结和比较: SQLite数据简介 是什么,内部结构是怎样的,数据库和表的关系是什么 有什么用 常用的操作是什么 SQLite数据库使用 增 删 改 查 SQLite数据库实践上的优化措施 对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,使我们轻松完成对数据的存取. 步骤1,熟悉创建数据库表,熟悉相关的操作指令,实现对SQLite数据库的感性认识 创建一个包含简单内容的数

Android数据存储之SQLite 数据库学习

Android提供了五种存取数据的方式 (1)SharedPreference,存放较少的五种类型的数据,只能在同一个包内使用,生成XML的格式存放在设备中 (2) SQLite数据库,存放各种数据,是一个轻量级的嵌入式数据库 (3) File文件,通过读取写入方式生成文件存放数据 (4) ContentProvider,主要用于让其他应用程序使用保存的数据 (5)通过网络获取数据和写入数据到网络存储空间 SQLite 数据库介绍 SQLite 是一款轻量级的关系型数据库,它的运算速度非常快,占

Android基础之十四数据存储 之 SQLite数据库详解

Android基础之十四数据存储 之 SQLite数据库详解 SQLite 是一款 轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百 K 的内存就足够了,因而特别适合在移动设备上使用. SQLite 不仅支持标准的 SQL 语法,还遵循了数据库的 ACID( 原子性(Atomicity) .一致性(Consistency) . 隔离性(Isolation) . 持久性(Durability))事务,所以只要你以前使用过其他的关系型数据库,就可以很快地上手 SQLite.而

【转载】Android数据存储之SQLite

SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/data/data/<包名>/databases/目录下. 主要特点: -轻量级 -独立性,没有不依赖,无需安装 -跨平台,支持众多操作系统 -支持高达2TB大小的数据库 -每个数据库以单个文件的形式存在 -以B-Tree的数据结构形式存储在硬盘 SQLite的数据类型: SQLite支持NULL.

Android数据存储之SQLite使用

SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/data/data/<包名>/databases/目录下. 主要特点: -轻量级 -独立性,没有不依赖,无需安装 -跨平台,支持众多操作系统 -支持高达2TB大小的数据库 -每个数据库以单个文件的形式存在 -以B-Tree的数据结构形式存储在硬盘 SQLite的数据类型: SQLite支持NULL.

android之存储篇——SQLite数据库

转载:android之存储篇_SQLite数据库_让你彻底学会SQLite的使用 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么. 例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值. 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误. 另外, SQLite 在解析CREATE TABLE 语句时

Android数据存储之Sqlite采用SQLCipher数据库加密实战

前言: 最近研究了Android Sqlite数据库(文章地址:http://www.cnblogs.com/whoislcj/p/5506294.html)以及ContentProvider程序间数据共享(http://www.cnblogs.com/whoislcj/p/5507928.html),我们清晰的知道Sqlite数据库默认存放位置data/data/pakage/database目录下,对于已经ROOT的手机来说的没有任何安全性可以,一旦被利用将会导致数据库数据的泄漏,所以我们该

Android数据存储之SQLite的操作

Android作为一个应用在移动设备上的操作系统,自然也就少不了数据的存储.然而SQLite作为一个轻型的关系型数据库,基于其轻量.跨平台.多语言接口及安全性等诸多因数考虑,因而Android较大的数据存储采用了SQLite.SQLite与大多数关系型数据库一样都遵循ACID,语法也非常相似.只要您懂得mysql.sqlserver等关系型数据库的操作,只要查看下SQLite的官方文档便可快速上手.SQLite语法您可通过http://sqlite.org/lang.html进行查看. 接下来看

android数据存储之Sqlite(一)

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