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. @H_502_43@@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)">}
@H_502_405@/**
  • *DbOpenHelper.java
  • */
  • importandroid.content.Context;
  • importandroid.database.sqlite.sqliteDatabase;
  • importandroid.database.sqlite.sqliteOpenHelper;
  • publicclassDbOpenHelperextendssqliteOpenHelper{
  • publicDbOpenHelper(Contextcontext,Stringname,153); font-weight:bold">intversion){
  • super(context,name,version);
  • /**
  • *数据库只有在第一次创建时才调用方法,对于一个已经存在的数据库,该方法不执行
  • *sqliteDatabase.openOrCreateDatabase()
  • voidonCreate(sqliteDatabasedb){
  • Stringsql="createtableuser(_idintegerprimarykeyautoincrement,namevarchar(10),ageinteger)";
  • db.execsql(sql);
  • *只有当数据库的版本号增加时,才会执行到该函数
  • *初始默认数据库版本为0,当构造函数传递newVersion时,这时会有db.getVersion()与newVersion比较觉得该函数是否执行
  • voidonUpgrade(sqliteDatabasedb,153); font-weight:bold">intoldVersion,153); font-weight:bold">intnewVersion){
  • }
  • 3.getReadableDatabase()和getWritableDatabase()区别

    (1).getReadableDatabase()

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

    (2).getWritableDatabase()

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

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

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

    (1).主要方法

    1. c.move(intoffset);//以当前位置为参考,移动到指定行
    2. c.moveToFirst();//移动到第一行
    3. c.moveToLast();//移动到最后一行
    4. c.moveToPosition(intposition);//移动到指定行
    5. c.moveToPrevIoUs();//移动到前一行
    6. c.moveToNext();//移动到下一行
    7. c.isFirst();//是否指向第一条
    8. c.isLast();//是否指向最后一条
    9. c.isBeforeFirst();//是否指向第一条之前
    10. c.isAfterLast();//是否指向最后一条之后
    11. c.isNull(intcolumnIndex);//指定列是否为空(列基数为0)
    12. c.isClosed();//游标是否已关闭
    13. c.getCount();//总数据项数
    14. c.getPosition();//返回当前游标所指向的行数
    15. c.getColumnIndex(StringcolumnName);//返回某列名对应的列索引值
    16. 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
      @H_502_405@//数据库事务
    13. voiddbTransacation(){
    14. //开始事务
    15. {
    16. //多个sql执行语句
    17. //设置事务成功完成,将缓冲区的数据提交
    18. 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分页查询

      @H_502_405@//方法一:select*fromtable_namewhereid>7limit10offset3;
    19. limit10offset3;//limitN表示取N个记录,offsetP表示跳过P行.
    20. //方法二:select*fromtable_namewhereid>7limit3,10;
    21. 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\%'

    猜你在找的Sqlite相关文章