Android开发_SQLite数据库

来源:互联网 发布:域名城论坛 编辑:程序博客网 时间:2024/05/16 04:15

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);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE user(name VARCHAR 20 NOT NULL,age INT PRIMARY KEY AUTOINCREMENT");}@Overridepublic 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 {@Overrideprotected 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();}}

0 0