SQLite数据库简介
SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。
SQLite由以下几个部分组成:SQL编译器、内核、后端以及附件。SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展SQLite的内核变得更加方便。所有SQL语句都被编译成易读的、可以在SQLite虚拟机中执行的程序集。
SQLite可以支持高达2TB大小的数据库,每个数据库都是以单个文件的形式存在,这些数据都是以B-Tree的数据结构形式存储在磁盘上。
在事务处理方面,SQLite通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程想数据库执行写操作之前,必须获得独占锁。在获得独占锁之后,其他的读或写操作将不会再发生。
SQLite采用动态数据类型,当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储,SQLite称这为“弱类型”。但有一个特例,如果是INTEGER PRIMARY KEY,则其他类型不会被转换,会报一个“datatype missmatch”的错误。
概括来讲,SQLite支持NULL、INTEGER、REAL、TEXT和BLOB数据类型,分别代表空值、整型值、浮点值、字符串文本、二进制对象。
SQLite存储的位置:/data/data/package/databases/database-name
Android中SQLite数据库的使用
在android中提供可一个 创建数据库的辅助类SQLiteOpenHelper,通常我们自定义一个类来继承它
public class MyDB extends SQLiteOpenHelper {
private static final String DB_NAME = "mydata.db"; // 数据库名称
private static final int version = 1; // 数据库版本
public MyDB(Context context) {
super(context, DB_NAME, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE user(name VARCHAR 20 NOT NULL,age INT PRIMARY KEY AUTOINCREMENT");
}
@Override
public void onUpgrade(SQLiteDatabase db, int ov, int nv) {
}
}
其中onCreate方法会在数据库第一次创建时由系统调用,而onUpgrade方法会在数据库更新时由系统调用。
数据库的创建
可以通过调用了SQLiteOpenHelper类的getReadableDatabase()方法或getWritableDatabase()方法来创建数据库对象
其中getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。
getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。
MyDB db = new MyDB(this);
SQLiteDatabase db1 = db.getWritableDatabase();
SQLiteDatabase db2 = db.getReadableDatabase();
常用的操作方法
1、插入数据:(long) insert(String table,String nullColumnHack,ContentValues values)
2、删除数据:(int) delete(String table,String whereClause,String[] whereArgs)
3、更新数据:(int) update(String table, ContentValues values, String whereClause, String[] whereArgs)
4、查询数据:(Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
5、执行一个SQL语句:(void) execSQL(String sql)
6、运行一个预置的SQL语句,返回带游标的数据集:(Cursor) rawQuery(String sql, String[] selectionArgs)
Cursor游标常用的方法
1、getCount() 总记录条数
2、isFirst() 判断是否第一条记录
3、isLast() 判断是否最后一条记录
4、moveToFirst() 移动到第一条记录
5、moveToLast() 移动到最后一条记录
6、move(int offset) 移动到指定的记录
7、moveToNext() 移动到吓一条记录
8、moveToPrevious() 移动到上一条记录
9、getColumnIndex(String columnName) 获得指定列索引的int类型值
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyDB db = new MyDB(this);
SQLiteDatabase sdbw = db.getWritableDatabase();
// 向数据库中插入数据
ContentValues cv = new ContentValues();
cv.put("name", "aaa");
cv.put("age", "20");
sdbw.insert("user", null, cv);
sdbw.close();
// 读取数据
SQLiteDatabase sdbr = db.getReadableDatabase();
Cursor c = sdbr.query("user", null, null, null, null, null, null);
while (c.moveToNext()) {
String name = c.getString(c.getColumnIndex("name"));
int age = c.getInt(c.getColumnIndex("age"));
System.out.println("name=" + name + ",age=" + age);
}
sdbr.close();
}
}