关于sqlite的数据库操作

sqlite是Android上使用的一种轻量级数据库,sqlite本身是一个开源的小型数据库,它占用空间小,资源少,适用于各种嵌入式设备、移动终端等;

 
如何打开/创建一个数据库
 
//打开或创建test.db数据库  
SQLiteDatabase db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null);  
 
这样就可以在test.db没有的情况下,创建test.db,在已经存在的情况下,会打开这个数据库;数据库默认的生成路径为:
/data/data/[PACKAGE_NAME]/databases
 
 
可以通过 
db.execSQL(String);
db.execSQL(String sql, String[] sqlArgs);
 
来执行sql语句;
除了上面的方式执行sql以外,还可以通过insert方法插入数据:

db.insert(String table, String nullColumnHack, ContentValues values);
 
通过下面方法更新数据:
db.update(String table, ContentValues values, String whereClause, String[] whereArgs) ;
 
通过delete 方法来删除数据;
int delete (String table, String whereClause, String[] whereArgs) ;
 
其中 ContentValues  是一个键值对数据结构,用法与HashMap类似;
 
ContentValues cv = new ContentValues();  
cv.put("name", person.name);  
cv.put("age", person.age);  
 
 
查询方法:
public Cursor rawQuery (String sql, String[] selectionArgs) ;
public Cursor query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) ;
public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) ;
public Cursorquery(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) ;
 
第一种方法是直接通过sql语句来查询,其他几种是指定表名,字段,等等进行的查询;
 
每种方式都返回Cursor对象,指向的是数据库数据;
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);   //返回当前行指定列的值  
 
最后我们调用db.close(); 关闭数据库;
 
一般来说,我们不会让我们的上层业务代码直接使用原生的 SQLiteDatabase来进行数据库操作,而是通过继承SQLiteOpenHelper扩展一个类,用于进行相关的数据库操作;
通常来说,我们继承 SQLiteOpenHelper 的时候,需要实现 onCreate 和 onUpgrade 两个函数;
例如我们继承一个SQLiteOpenHelper类
 
public class DBHelper extends SQLiteOpenHelper {  
    private static final String DATABASE_NAME = "test.db";  
    private static final int DATABASE_VERSION = 1;  
 
    public DBHelper(Context context) {  
        //CursorFactory设置为null,使用默认值  
        super(context, DATABASE_NAME, null, DATABASE_VERSION);  
    }  
 
    //数据库第一次被创建时onCreate会被调用  
    @Override  
    public void onCreate(SQLiteDatabase db) {  
        db.execSQL("CREATE TABLE IF NOT EXISTS person" +  
                "(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER, info TEXT)");  
    }  
 
    //如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade  
    @Override  
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
        db.execSQL("ALTER TABLE person ADD COLUMN other STRING");  
    }  
}  
 
针对于onCreate应该都知道了,就是数据库第一次被创建的时候被调用;
onUpgrade会在什么时候被调用呢?
因为在 SQLiteOpenHelper里面,构造函数:
public SQLiteOpenHelper (Context context, String name, SQLiteDatabase.CursorFactory factory, int version) ;
 
每次调用 该构造函数的时候,都会传入 version ,SQLiteHelper如果防线version与原有version不一致的时候,就会在调用原来创建数据库onCreate的地方改为去调用onUpgrade函数,这个时候,我们只需要在更新的apk的代码里面,增加对应的数据库DDL和DML的变更就可以了;
 
一般来说,我们使用Helper的方式是这样的;
SQLiteDatabase db = helper.getWritableDatabase();
 
通过 getWritableDatabase 函数,使得首次创建的时候SQLiteHelper的onCreate函数被调用到,从而使得数据库被创建;如果是数据库升级的话,则onUpgrade会被调用到;
这样的话,我们将上面使用Helper的代码给封装起来,放在某个数据库操作类中,供业务层调用就可以了;
 
 
上面的内容,主要是学习了  http://blog.csdn.net/liuhe688/article/details/6715983 这篇文章;
 
 
 
 
原文地址:https://www.cnblogs.com/coldforce/p/4993385.html