加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SQLite_Android

发布时间:2020-12-12 19:39:51 所属栏目:百科 来源:网络整理
导读:1.SQLite概述 SQLite是一款轻量级的关系型数据库,由于它占用的资源非常少,所以在很多嵌入式设备都是用SQLite来存储数据。Android作为目前主流的移动操作系统,完全符合SQLite占用资源少的优势,故在Android平台上,集成了一个嵌入式关系型数据库SQLite。

1.SQLite概述

SQLite是一款轻量级的关系型数据库,由于它占用的资源非常少,所以在很多嵌入式设备都是用SQLite来存储数据。Android作为目前主流的移动操作系统,完全符合SQLite占用资源少的优势,故在Android平台上,集成了一个嵌入式关系型数据库SQLite。

继承SQLiteOpenHelper类,同时覆盖onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)和定义构造函数,使用该类实例对象的getReadableDatabase()或者getWritableDatabase()得到当前数据库的实例化对象,可直接对其进行操作

2.SQLite实现增删改查

[java]view plaincopy
  1. //数据库的基本操作,增删改查
  2. @Override
  3. protectedvoidonCreate(BundlesavedInstanceState){
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. DbOpenHelperdbOpenHelper=newDbOpenHelper(this,"mytest.db",1);
  7. SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
  8. //////////////////////////////////////////////////////////
  9. db.execSQL("insertintouser(name,age)values(?,?)",newObject[]{"zhang",0)">10});//1.1增
  10. db.execSQL("deletefromuserwhere_id=?",153); font-weight:bold">newString[]{"1"});//1.2删
  11. db.execSQL("updateusersetname=?where_id=?",153); font-weight:bold">newString[]{"haha","2"});//1.3改
  12. Cursorcursor=db.rawQuery("select*fromuserwhereage>=?",0)">//1.4查
  13. while(cursor.moveToNext()){
  14. Toast.makeText(1),Toast.LENGTH_SHORT).show();
  15. }
  16. ContentValuesvalues=newContentValues();//2.1增
  17. values.put("name","John");
  18. values.put("age",0)">20);
  19. db.insert("user",//表格名
  20. "name",0)">//StringnullColumnHack
  21. //SQl不允许插入一个空行,当values的值为空时,将相当于执行于
  22. //insertintoage(name)values("null");
  23. values);//插入值,相当于一个键值对的集合
  24. db.delete("user","age>=?andage<=?",153); font-weight:bold">newString[]{"12","18"});//2.2删
  25. ContentValuesvalues1=//2.3改
  26. "liu");
  27. db.update("user",values1,"_id=?",153); font-weight:bold">newString[]{"8"});
  28. Cursorcursor1=db.query("user",0)">//表格名//2.4查
  29. null,0)">//String[]columns如果为空,则返回所有列
  30. "age>=?",0)">//Stringselection查询条件
  31. newString[]{"15"},0)">//String[]selectionArgs查询参数
  32. //StringgroupBy
  33. //Stringhaving
  34. null);//StringorderBy
  35. while(cursor.moveToNext()){
  36. intid=cursor1.getInt(cursor1.getColumnIndex("_id"));
  37. "name")),255)">}
    /**
  1. *DbOpenHelper.java
  2. */
  3. importandroid.content.Context;
  4. importandroid.database.sqlite.SQLiteDatabase;
  5. importandroid.database.sqlite.SQLiteOpenHelper;
  6. publicclassDbOpenHelperextendsSQLiteOpenHelper{
  7. publicDbOpenHelper(Contextcontext,Stringname,153); font-weight:bold">intversion){
  8. super(context,name,version);
  9. /**
  10. *数据库只有在第一次创建时才调用该方法,对于一个已经存在的数据库,该方法不执行
  11. *SQLiteDatabase.openOrCreateDatabase()
  12. voidonCreate(SQLiteDatabasedb){
  13. Stringsql="createtableuser(_idintegerprimarykeyautoincrement,namevarchar(10),ageinteger)";
  14. db.execSQL(sql);
  15. *只有当数据库的版本号增加时,才会执行到该函数
  16. *初始默认数据库版本为0,当构造函数传递newVersion时,这时会有db.getVersion()与newVersion比较觉得该函数是否执行
  17. voidonUpgrade(SQLiteDatabasedb,153); font-weight:bold">intoldVersion,153); font-weight:bold">intnewVersion){
  18. }

3.getReadableDatabase()和getWritableDatabase()区别

(1).getReadableDatabase()

使用SQLiteDatabase实例对象的getReadableDatabase()方法,首先会检查数据库是否已经实例化并处于打开状态,如果满足要求直接返回数据库对象,否则试图返回一个可读写模式的数据库,但当磁盘空间已满,只能得到只读模式数据库对象

(2).getWritableDatabase()

使用SQLiteDatabase实例对象的getWritableDatabase()方法,目的是得到一个具有可读写的数据库实例对象,首先判断mDatabase是否不为空且已打开且不是只读模式,则直接返回该实例对象,否则如果mDatabase不为空则加锁,然后开始打开或创建数据库,进行版本相关操作并解锁,最后返回数据库实例对象!

总之,一般情况下,通过这两种方法获得的数据库实例对象时一样的,只有在数据库空间已满或其它情况下,通过getReadableDatabase得到的才是只读的实例对象

    //得到一个具有可读写的数据库实例对象
  1. synchronizedSQLiteDatabasegetWritableDatabase(){
  2. if(mDatabase!=null&&mDatabase.isOpen()&&!mDatabase.isReadOnly()){
  3. returnmDatabase;//如mDatabase不为空已打开并且不是只读模式则返回该对象
  4. }
  5. if(mIsInitializing){//判断是否正在初始化
  6. thrownewIllegalStateException("getWritableDatabasecalledrecursively");
  7. booleansuccess=false;//默认为false
  8. SQLiteDatabasedb=null;
  9. null)
  10. mDatabase.lock();//如果mDatabase不为空则加锁阻止其他的操作
  11. try{
  12. mIsInitializing=true;//初始化完成
  13. if(mName==null){
  14. db=SQLiteDatabase.create(null);
  15. }else{
  16. db=mContext.openOrCreateDatabase(mName,0,mFactory);//打开或创建数据库
  17. intversion=db.getVersion();//获取数据库版本(如果新创建的数据库版本为0)
  18. if(version!=mNewVersion){//获得的数据库版本号与指定的数据库版本号进行比较
  19. db.beginTransaction();//开始事务
  20. if(version==0){//新建的数据库版本号为0,则直接执行onCreate方法
  21. onCreate(db);
  22. else{
  23. onUpgrade(db,version,mNewVersion);//如果版本号发生变化,且不是新建的数据库,则执行onUpgrade方法
  24. db.setVersion(mNewVersion);//为当前的数据库设置新版本号
  25. db.setTransactionSuccessful();//设置事务成功提交
  26. finally{
  27. db.endTransaction();//结束事务
  28. onOpen(db);
  29. success=true;
  30. returndb;//返回当前的可读写模式数据库实例对象
  31. false;
  32. if(success){
  33. null){
  34. mDatabase.close();//如果mDatabase存在则先关闭
  35. catch(Exceptione){
  36. mDatabase.unlock();//为当前的数据库实例对象进行解锁操作
  37. mDatabase=db;
  38. mDatabase.unlock();
  39. if(db!=db.close();
    1. /*
    2. *在getReadableDatabase()方法中,首先检查数据库是否已经实例化并处于打开状态
    3. *如果满足要求直接返回数据库对象,否则试图获取一个可读写模式的数据库实例;
    4. *当磁盘空间已满,再以只读模式打开数据库
    5. synchronizedSQLiteDatabasegetReadableDatabase(){
    6. null&&mDatabase.isOpen()){
    7. //如果发现mDatabase存在并已打开,则直接返回该数据库对象
    8. //检查数据库是否正在进行初始化操作
    9. newIllegalStateException("初始化");
    10. /******注意!!!调用了getWritableDatabase()方法*****/
    11. returngetWritableDatabase();//一般情况下使用getReadableDatabase得到的是getWritableDatabase的数据库对象
    12. catch(SQLiteExceptione){
    13. throwe;
    14. *使用可读写不能得到数据库对象,下面的操作只能得到对对象
    15. *常见数据库已满,不能再添加数据,此时只能写,不能读
    16. */
    17. null;
    18. try{
    19. Stringpath=mContext.getDatabasePath(mName).getPath();
    20. db=SQLiteDatabase.openDatabase(path,mFactory,SQLiteDatabase.OPEN_READONLY);//以只读方式打开数据库
    21. if(db.getVersion()!=mNewVersion){//只读数据库,不接收新版本数据库
    22. newSQLiteException("Can'tupgraderead-onlydatabasefromversion"+db.getVersion()+"to"
    23. +mNewVersion+":"+path);
    24. Log.w(TAG,"Opened"+mName+"inread-onlymode");
    25. mDatabase=db;//mDatabase为打开的数据库对象
    26. returnmDatabase;
    27. finally{
    28. false;
    29. null&&db!=mDatabase)
    30. db.close();
    31. 4.Cursor对象

      (1).主要方法

        c.move(intoffset);//以当前位置为参考,移动到指定行
      1. c.moveToFirst();//移动到第一行
      2. c.moveToLast();//移动到最后一行
      3. c.moveToPosition(intposition);//移动到指定行
      4. c.moveToPrevious();//移动到前一行
      5. c.moveToNext();//移动到下一行
      6. c.isFirst();//是否指向第一条
      7. c.isLast();//是否指向最后一条
      8. c.isBeforeFirst();//是否指向第一条之前
      9. c.isAfterLast();//是否指向最后一条之后
      10. c.isNull(intcolumnIndex);//指定列是否为空(列基数为0)
      11. c.isClosed();//游标是否已关闭
      12. c.getCount();//总数据项数
      13. c.getPosition();//返回当前游标所指向的行数
      14. c.getColumnIndex(StringcolumnName);//返回某列名对应的列索引值
      15. c.getString(//返回当前行指定列的值

      (2).Cursor对象的管理

      Activity提供了LoaderManager去管理cursor的生命周期,可参考cursor管理>>

      (3).Cursor注意情况

      1).要求

      需要注意的是,在cursor的结果集中必须要包含一个“_id”的列,否则SimpleCursorAdapter会不识别,因为这源于SQLite的规范,主键以“_id”为标准。

      2).措施

      第一,建表时根据规范去做;
      第二,查询时用别名,例如:SELECT id AS _id FROM person;
      第三,使用CursorWrapper

      1. CursorWrappercursorWrapper=newCursorWrapper(c){
      2. @Override
      3. intgetColumnIndexOrThrow(StringcolumnName)throwsIllegalArgumentException{
      4. if(columnName.equals("_id")){
      5. returnsuper.getColumnIndex("id");
      6. }
      7. super.getColumnIndexOrThrow(columnName);
      8. }

      5.防止数据重复插入

        @Override
      1. voidonCreate(SQLiteDatabasedb){
      2. Stringsql="createtablebitmap("+
      3. "_idintegerprimarykeyautoincrement,"+
      4. *防止重复,如果发现重复,数据不能添加
      5. *fileNamevarchar(100)UNIQUE
      6. *
      7. *如果是下面这样声明,重复冲突后,原有的数据将会被替换
      8. *fileNamevarchar(100)UNIQUEONCONFLICTREPLACE
      9. "fileNamevarchar(100)UNIQUE,255)">"latitudevarchar(100),"+
      10. "longitudevarchar(100),255)">"addrvarchar(100),255)">"isSavedinteger,255)">"modelvarchar(100))";
      11. db.execSQL(sql);
      12. 6.事务Transacation
          //数据库事务
        1. voiddbTransacation(){
        2. //开始事务
        3. {
        4. //多个sql执行语句
        5. //设置事务成功完成,将缓冲区的数据提交
        6. 7.关于CursorIndexOutOfBoundsException

          在使用SQLiteDatabase.openOrCreateDatabase()去打开一个sdcard上的db文件时,此时光标应该移动为记录的最后,如果没有使用cursor.moveToFirst(),就会报该异常,所有任何游标使用时,应该先moveToFirst()

            if(cursor!=null&&cursor.getCount()>0){
          1. cursor.moveToFirst();
          2. intindexTrainsetType=cursor.getColumnIndex(TrainsetTypeMetaDate.trainsetType);
          3. do{
          4. StringtrainsetType=cursor.getString(indexTrainsetType);
          5. list.add(trainsetType);
          6. while(cursor.moveToNext());
          7. }

          8.SQLITE分页查询

            //方法一:select*fromtable_namewhereid>7limit10offset3;
          1. limit10offset3;//limitN表示取N个记录,offsetP表示跳过P行.
          2. //方法二:select*fromtable_namewhereid>7limit3,10;
          3. 3,0)">10;//limitindex,count表示跳过index行后,取出count个记录

          9.Update or Replace

          <code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas,serif; white-space: inherit; background-color: rgb(255,255);"><span class="kwd" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(0,139); background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">INSERT</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"> </span><span class="kwd" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(0,139); background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">OR</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"> REPLACE </span><span class="kwd" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(0,139); background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">INTO</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"> Employee </span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">(</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">id</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">,</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"> name</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">,</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"> role</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">)</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"> 
            </span><span class="kwd" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(0,139); background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">VALUES</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"> </span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">(</span><span class="lit" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(128,0); background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">1</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">,</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"> </span><span class="str" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(128,0); background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">'John Foo'</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">,0); background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">'CEO'</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">);</span></code>

          BAD: This will insert or replace 2 of the columns... the NAME column will be set to NULL or the default value:

           
           

          GOOD: This will update 2 of the columns. When ID=1 exists,the NAME will be unaffected. When ID=1 does not exist,the name will be default (NULL).

           
           

          This will update 2 of the columns. When ID=1 exists,the ROLE will be unaffected. When ID=1 does not exist,the role will be set to 'Benchwarmer' instead of the default value.

           
          

          10.Replace部分字符串

          You can use the built inreplace()function to perform a string replace in a query.

          Other string manipulation functions (and more) are detailed in theSQLite core functions list

          The following should point you in the right direction.

          UPDATE table SET field = replace( field,'C:afolder','C:anewfolder' ) WHERE field LIKE 'C:afolder%'

          (编辑:李大同)

          【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读