SQLite_Android

前端之家收集整理的这篇文章主要介绍了SQLite_Android前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1.sqlite概述

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

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

2.sqlite实现增删改查

  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. *在getReadableDatabase()方法中,首先检查数据库是否已经实例化并处于打开状态
  2. *如果满足要求直接返回数据库对象,否则试图获取一个可读写模式的数据库实例;
  3. *当磁盘空间已满,再以只读模式打开数据库
  4. synchronizedsqliteDatabasegetReadableDatabase(){
  5. null&&mDatabase.isOpen()){
  6. //如果发现mDatabase存在并已打开,则直接返回该数据库对象
  7. //检查数据库是否正在进行初始化操作
  8. newIllegalStateException("初始化");
  9. /******注意!!!调用了getWritableDatabase()方法*****/
  10. returngetWritableDatabase();//一般情况下使用getReadableDatabase得到的是getWritableDatabase的数据库对象
  11. catch(sqliteExceptione){
  12. throwe;
  13. *使用可读写不能得到数据库对象,下面的操作只能得到对对象
  14. *常见数据库已满,不能再添加数据,此时只能写,不能读
  15. */
  16. null;
  17. try{
  18. Stringpath=mContext.getDatabasePath(mName).getPath();
  19. db=sqliteDatabase.openDatabase(path,mFactory,sqliteDatabase.OPEN_READONLY);//以只读方式打开数据库
  20. if(db.getVersion()!=mNewVersion){//只读数据库,不接收新版本数据库
  21. newsqliteException("Can'tupgraderead-onlydatabasefromversion"+db.getVersion()+"to"
  22. +mNewVersion+":"+path);
  23. Log.w(TAG,"Opened"+mName+"inread-onlymode");
  24. mDatabase=db;//mDatabase为打开的数据库对象
  25. returnmDatabase;
  26. finally{
  27. false;
  28. null&&db!=mDatabase)
  29. db.close();
  30. 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\%'

      原文链接:https://www.f2er.com/sqlite/199379.html

      猜你在找的Sqlite相关文章