SQLite初步学习总结

来源:互联网 发布:mac创建电脑账户的提示 编辑:程序博客网 时间:2024/05/17 01:56

开篇语:写代码是一个动手实践的过程,就算理解了每句代码,不动手写,就什么也得不到。

我是正在实习的新手,有很多小的地方很困扰我,粗浅地谈谈我的理解吧,简单地聊聊,邀喷,嘿嘿。这周team leader布置的任务是学习Android中与数据库相关的知识,总结梳理一下这周学的知识。分如下几部分来总结吧

  • SQLite
  • Ormlite
  • Content Provider

1. SQLite基本介绍

  • 为什么要使用数据库?
    大多数程序都会涉及到有关数据的操作及管理、例如增删查改,这个时候SQLite是个不可多得的好帮手。

  • 数据库的操作有哪些?
    对于数据来说,增删查改为最基本的操作。

2.SQLite在安卓中的使用

  • SQLiteDatabase
    SQLiteDatabase类代表一个数据库,获取了了SQLiteDatabase类后,就可以对数据库进行管理,操作数据了。个人理解应该算是android中对数据库操作的基础了。
    创建/打开数据库的方式有两个,
    1.openSQLiteDatabase(…….)
    2.openOrCreateDatabase(…….)
    看名字就懂。

数据的添加
使用insert方法

ContentValues cv = new ContentValues();//实例化一个ContentValues用来装载待插入的数据cv.put("username","Jack Johnson");//添加用户名cv.put("password","iLovePopMusic"); //添加密码db.insert("user",null,cv);//执行插入操作

使用execSQL

String sql = "insert into user(username,password) values ('Jack Johnson','iLovePopMuisc');//插入操作的SQL语句db.execSQL(sql);//执行SQL语句据的删除2种方式可以实现String whereClause = "username=?";//删除的条件String[] whereArgs = {"Jack Johnson"};//删除的条件参数db.delete("user",whereClause,whereArgs);//执行删除

使用execSQL方式的实现

String sql = "delete from user where username='Jack Johnson'";//删除操作的SQL语句db.execSQL(sql);//执行删除操作

数据修改
同上,仍是2种方式

ContentValues cv = new ContentValues();//实例化ContentValuescv.put("password","iHatePopMusic");//添加要更改的字段及内容String whereClause = "username=?";//修改条件String[] whereArgs = {"Jack Johnson"};//修改条件的参数db.update("user",cv,whereClause,whereArgs);//执行修改

使用execSQL方式的实现

String sql = "update [user] set password = 'iHatePopMusic' where username='Jack Johnson'";//修改的SQL语句db.execSQL(sql);//执行修改

数据查询
数据查询相对前面几种方法就复杂一些了,因为查询会带有很多条件
通过query实现查询的

public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

各参数说明:

table 表名称 colums 列名称数组 selection 条件子句,相当于where selectionArgs 条件语句的参数数组 groupBy 分组 having 分组条件 orderBy 排序类 limit 分页查询的限制 Cursor 返回值,相当于结果集ResultSet

2.SQLiteOpenHelper
实际开发中很少有直接使用SQLiteDatabase的方法来打开数据库,通常都会继承SQLiteOpenHelper中的getReadableDatabase()、getWritable()方法得到一个SQLiteDatabase.
SQLiteOpenHelper从名字上来看是android为开发者提供的一个帮助管理数据库的类,调用其构造器时,会要求调用基类构造器,通过基类构造方法来创建一个数据库,比如我的final String name 就是我的数据库的名字。使用时让自己定义的类来继承它,需要复写两个函数

public class SQLHelper extends SQLiteOpenHelper{    private static final String name = "person.db"; //数据库名称。    private static final int VERSION = 1; //数据库版本    public SQLHelper(Context context)[        super(context,name,null,VERSION);    }    public SQLHelper(Context context,int version){        super(context,name,null,version);    }    public SQLHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);    }    /**    * 该方法于初次创建数据库的时候使用    */    @Override    public void onCreate(SQLiteDatabase db) {        db.execSQL("CREATE TABLE person (_id INTEGER PRIMARY KEY AUTOINCREMENT ,age TEXT);");    }    /**     * 该方法在newVersion>oldVersion时调用     */    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {         Log.e("version update",newVersion+"");    }}

可以发现onUpgrade()是个回调函数,具体是什么时候调用呢?
我定义了两个构造器,一个带参数int version , 另一个不带,为了简单地测试一下,我在Activity中调用了无version信息构造器helper = new SQLHelper(this);(此时默认版本为1),之后修改为helper = new SQLHelper(this,2);再次启动程序,调出logcat可以看到如下:

这里写图片描述

可以看到,通过构造器传参数,当version>old version时候会调用函数onUpgrade();

既然version参数可以>old version,为什么不能 < version呢?
不用担心,当然也有onDowngrade()函数啦。

3. Cursor

  • 什么是cursor?
    我在这个问题上纠结了很久。通过db中的query,rawQuery语句都有返回cursor的重载方法,那么cursor究竟是什么?我个人理解是指向某个(一系列)符合条件的数据(集合)游标,你可以查询当前cursor指向的数据项中的一系列数据,比我的创建的person表中会有,name,age,那么你就可以通过cursor来查询这些信息。

  • cursor中的常用方法

methon 用途 close() 关闭游标,释放资源 copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) 在缓冲区中检索请求的列的文本,将将其存储 getColumnCount() 返回所有列的总数 getColumnIndex(String columnName) 返回指定列的名称,如果不存在返回-1 getColumnIndexOrThrow(String columnName) 从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。 getColumnName(int columnIndex) 从给定的索引返回列名 getColumnNames() 返回一个字符串数组的列名 getCount() 返回Cursor 中的行数 moveToFirst() 移动光标到第一行 moveToLast() 移动光标到最后一行 moveToNext() 移动光标到下一行 moveToPosition(int position) 移动光标到一个绝对的位置 moveToPrevious() 移动光标到上一行

举个例子,如果我想获得我当前游标所指数据项的age属性

//先获得person表中age的列数int nameColumnIndex = cur.getColumnIndex(Person.AGE);//通过列数获得当前列的数据String name = cur.getString(nameColumnIndex);

4. SimpleCursorAdapter
这个类可以将查询的一些列结果配置到一个list中,具体的用法

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list_item, cursor,new String[]{"_id", "age"}, new int[]{R.id.item_name, R.id.item_age});//ls = (ListView) findViewById(R.id.personlist);ls.setAdapter(adapter);

我相信大部分接触过list的同学都知道SimpleAdapter,把Cursor看成Map < Key,Value>,那么SimpleCursorAdapter和SimpleAdapter就很像了。

SimpleCursorAdapter使用中值得一提的是,SimpleCursorAdapter封装cursor要求底层数据表的主键列的列名为”_id”,因为SimpleCursorAdapter只能识别名为”_id”的主键,否则就会出现java.lang.IllegalArgumentException:colun ‘_id’ does not exist的错误。

结束语:有关数据库基础要使用到的东西就暂时介绍到这吧。有什么问题欢迎各位支出!

附大牛的详细介绍数据库基础与android中数据库的使用文章链接:
数据库基础知识
Android中使用数据库详解

0 0