Android数据存储之SQLite数据库

人生必须的知识就是引人向光明方面的明灯。这篇文章主要讲述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:获取指定字段的字段类型
【Android数据存储之SQLite数据库】由于数据库操作的特殊性,不方便单独演示某个功能,接下来通过用户注册信息数据库的例子来看一下完整代码:
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; } }


    推荐阅读