欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

sqlite数据库操作

程序员文章站 2022-04-15 19:36:47
...

几个重要类

  • ContentValues:存储数据的容器,内部构造为HashMap,拥有key,value两值,但key只能是string类型的,value只能存储基本数据类型,不能存储对象;
    
  • SQLiteDatabase:
    
  • Cursor:数据库查询语句返回的一个对象,代表数据的游标(定位)
    常用的方法有:
    	c.move(int offset); //以当前位置为参考,移动到指定行  
    	c.moveToFirst();    //移动到第一行  
    	c.moveToLast();     //移动到最后一行  
    	c.moveToPosition(int position); //移动到指定行  
    	c.moveToPrevious(); //移动到前一行  
    	c.moveToNext();     //移动到下一行  
    	c.isFirst();        //是否指向第一条  
    	c.isLast();     //是否指向最后一条  
    	c.isBeforeFirst();  //是否指向第一条之前  
    	c.isAfterLast();    //是否指向最后一条之后  
    	c.isNull(int columnIndex);  //指定列是否为空(列基数为0)  
    	c.isClosed();       //游标是否已关闭  
    	c.getCount();       //总数据项数  
    	c.getPosition();    //返回当前游标所指向的行数  
    	c.getColumnIndex(String columnName);//返回某列名对应的列索引值  
    	c.getString(int columnIndex);   //返回当前行指定列的值 
    
  • SQLiteOpenHelper:
    通过SQLiteOpenHelper类来实现对SQLite数据库的操作,管理数据库(创建、增、修、删) & 版本的控制
    使用过程:通过创建子类继承SQLiteOpenHelper类,实现它的一些方法来对数据库进行操作。  
    SQLiteOpenHelper类的数据库操作方法:
    	onCreate();创建数据库时自动调用,用于创建数据库;
    	onUpgrade();升级数据库
    	close();关闭所有打开的数据库对象
        execSQL();可进行增删改操作, 不能进行查询操作
        query();rawQuery();查询数据库
        insert();插入数据
        delete();删除数据
        getWritableDatabase();通过返回的SQLiteDatabase对象对数据库进行操作
    	getReadableDatabase();通过返回的SQLiteDatabase对象对数据库进行操作
    

    数据库操作

    • 创建表格

      创建子类继承SQLiteOpenHelper类,实现Oncreate()方法
          调用SQLiteDatabase的execSql()方法,代入写好的sql语句,生成表格
      
    • 插入数据

      1.用容器ContentValues
      	存储添加数据的字段以及字段值;
      2.根据继承的子类调用getWritableDatabase()方法获得SQLiteDatabase对象;
      3.调用SQLiteDatabase对象的方法isnert(?,?,?)插入数据;
          第一个参数:要插入数据库的表名
          第二个参数:null(防止第三个参数为空造成的sql语句错误)
          第三个参数:ContentValues对象
        返回long值,-1代表插入失败
              
      例子:
              public void insert(Note note){
              cv.put(notesDB.getTIME(),note.getTIME());
              cv.put(notesDB.getCONTENT(),note.getCONTENT());
              cv.put(notesDB.getIMGPATH(),note.getIMGPATH());
              cv.put(notesDB.getTYPE(),note.getTYPE());
              cv.put(notesDB.getTXTCOLOR(),note.getTXTCOLOR());
              cv.put(notesDB.getTXTSIZE(),note.getTXTSIZE());
              cv.put(notesDB.getBGIMG(),note.getBGIMG());
              dbWriter.insert(notesDB.getTABLENAME(),null,cv);
          }
      
    • 删除数据

      根据继承的子类调用getWritableDatabase()方法获得SQLiteDatabase对象,并调用delete方法,delete(?,?,?)
          第一个参数:操作表名;
          第二个参数:sql语句中的where部分,即删除条件,为null则无条件,条件值用?代替
          第三个参数:给where语句传参,必须是String[]数组类型,即使只有一个参数;按顺序替换					第二个参数中的“?”
      例子:
              public void delete(String id){
              dbWriter.delete(notesDB.getTABLENAME(),notesDB.getID()+"=?",new String[]{id});
          }
      
    • 修改数据

      1.将要修改的字段以及字段字存入ContentValues对象中;
      2.根据继承的子类调用getWritableDatabase()方法获得SQLiteDatabase对象
      3.SQLiteDatabase对象调用update();方法
          update(?,?,?,?);
      	第一个参数:操作表名
          第二个参数:需要修改的字段容器,即为ContentValues对象;
          第三个参数:where表达式的内容,即为条件,否则全部修改,条件值用?代替
          第四个参数:给where语句传参,必须是String[]数组类型,即使只有一个参数;按顺序替换							第二个参数中的“?”
           例子:
              public void update(Note note){
              cv.put(notesDB.getTIME(),note.getTIME());
              cv.put(notesDB.getCONTENT(),note.getCONTENT());
              cv.put(notesDB.getIMGPATH(),note.getIMGPATH());
              cv.put(notesDB.getTYPE(),note.getTYPE());
              cv.put(notesDB.getTXTCOLOR(),note.getTXTCOLOR());
              cv.put(notesDB.getTXTSIZE(),note.getTXTSIZE());
              cv.put(notesDB.getBGIMG(),note.getBGIMG());
              dbWriter.update(notesDB.getTABLENAME(),cv,notesDB.getID()+"=?",new String[]{note.getID()});
          }
      
    • 查询数据

      1.根据继承的子类调用getReadableDatabase()方法获得SQLiteDatabase对象(此处查找用的是Read,注意)
      2.SQLiteDatabase对象直接调用query()方法
          query(?,?,?,?,?,?,?,?);(共八个参数)
      	第一个参数:操作的表名
          第二个参数:select与from之间要显示的字段名集合(故此处需要建立一个String[] cols去存储字段)     第三个参数:sql语句中的where部分的条件内容,可以为null,全部查找;
          第四个参数:sql语句中的group By内内容,指定分组条件,可以为null,此时不分组查询;
          第五个参数:sql语句中的having内容,分组后的过滤,配合groupby使用,可以为null
          第六个参数:sql语句中的orderby内容,指定查询结果后的排序字段,可以为null,此时不查询
          第七个参数:sql语句中的limit内容,指定分页参数,可以为null,此时不分页;
          第八个参数:truefalse值,选择是否过滤重复值
              七与八个参数可以忽略不写
              
      3.该方法调用后取得游标cursor,取出数据需要调用cursor的两个方法
              首先根据字段获取下标index = cursor.getColumnIndex("id");(因为字段多个,是一个集合)
      		然后调用cursor.getString(index),根据下标取出String类型的值
         因为查询结果多条,故需要使用while语句取值,
                  条件则为cursor.moveToNext();该方法读取下一行是否有数据,无则为false,有则为true
                  
      例子:
                  public List<Note> selectByType(String type){
              List<Note> notes = new ArrayList<>();
              String[] cols = {
                      notesDB.getID(),
                      notesDB.getCONTENT(),
                      notesDB.getTIME(),
                      notesDB.getTYPE(),
                      notesDB.getIMGPATH(),
                      notesDB.getTXTCOLOR(),
                      notesDB.getTXTSIZE(),
                      notesDB.getBGIMG()
              };
              cursor = dbReader.query(
                  notesDB.getTABLENAME(), 
                  cols,notesDB.getTYPE()+"=?",
                  new String[]{type},
                  null,
                  null,
                  null,
                  null);
              while (cursor.moveToNext()){
                  Note note = new Note();
                  note.setID(cursor.getString(cursor.getColumnIndex(notesDB.getID())));
                  note.setCONTENT(cursor.getString(cursor.getColumnIndex(notesDB.getCONTENT())));
                  note.setTIME(cursor.getString(cursor.getColumnIndex(notesDB.getTIME())));
                  note.setTYPE(cursor.getString(cursor.getColumnIndex(notesDB.getTYPE())));
                  note.setIMGPATH(cursor.getString(cursor.getColumnIndex(notesDB.getIMGPATH())));
                  note.setTXTCOLOR(cursor.getString(cursor.getColumnIndex(notesDB.getTXTCOLOR())));
                  note.setTXTSIZE(cursor.getString(cursor.getColumnIndex(notesDB.getTXTSIZE())));
                  note.setBGIMG(cursor.getString(cursor.getColumnIndex(notesDB.getBGIMG())));
                  notes.add(note);
              }
              return notes!=null?notes:null;
          }
      

      参考资料

      结合资料,根据自己的理解作出的总结,有错误的话麻烦大家帮我指点,不懂的小弟也愿意帮助萌新小白,感谢大家观看!!!

相关标签: 安卓开发 安卓