SQLite初步学习总结

原创 2015年11月20日 15:24:52

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

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

相关文章推荐

Sqlite3数据库的初步学习

最近由于项目的需要,初步学习了Sqlite3数据库技术。现共享,希望能与家共同学习。至于深入的学习我将在后继的博客中与大家深入交流。SQLite,是一款轻型的数据库,是遵守ACID的关联式数...

SQLite3学习初步

在SQLite的官网上下载for windows的编译好的程序: 我目前下载到的版本是sqlite-shell-win32-x86-3070603 解压之后得到一个sqlite3.exe的可执行文...
  • xbl1986
  • xbl1986
  • 2011年12月08日 09:27
  • 2780

Sqlite数据库学习总结

  • 2013年09月04日 22:20
  • 67KB
  • 下载

Android学习总结四:SQLite3的使用

1.加载驱动public class PersonSQLiteOpenHelper extends SQLiteOpenHelper { public PersonSQLiteOpenHelp...
  • xz10561
  • xz10561
  • 2015年03月03日 18:05
  • 299

Android——SQLite学习总结

1.   除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据。 在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支...

ANDROID SQLITE学习总结

在Android开发过程中,如果要保存大量的数据的话,一般都是用SQLite,我的特点是占用内存小,使用简单,效率高等优良特点。广泛用于嵌入式开发过程中。而一般在开发过程中,我们会用一个类将其方法封装...

安卓SQLite学习总结

创建和管理数据库版本是用SQLiteOpenHelper()的具体用法

Sqlite3学习总结

其他相关博客参考 http://blog.csdn.net/conowen/article/details/7306545 http://blog.csdn.net/cjjky/article/d...

SQLite 锁机制学习总结 锁状态转换及锁机制实现代码分析

点击打开链接
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQLite初步学习总结
举报原因:
原因补充:

(最多只允许输入30个字)