SQLite初步学习总结

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

我是正在实习的新手,有很多小的地方很困扰我,粗浅地谈谈我的理解吧,简单地聊聊,邀喷,嘿嘿。这周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();//实例化ContentValues
cv.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中使用数据库详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值