1.SQLite是一个轻量级的数据库,体积大小只用几千字节,一些SQL的指令只是部分支持,列如:ALTER、TABLE。
创建数据库
Context.createDatabase(
String name,
int version,
int mode,
CursorFactory factory
)
创建一个新的数据库并返回一个SQLiteDatabase对象。
数据库不能被创建,则抛出FIleNotFoundException异常。
SQLite存储数据时不需要指定数据类型:SQLite只支持5种数据类型:null(空值)、integer(有符号整数类型)、real(浮点数类型)、text(字符串)、blob(二进制表示)
Create table users(_id integer primary key autoincrement , name, age)主键建议使用_id
2.使用步骤 (demo)
写个类继承SQLiteOpenHelper然后实现里面的方法。
packagecom.sqlitedemo;
importandroid.content.Context;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteDatabase.CursorFactory;
importandroid.database.sqlite.SQLiteOpenHelper;
importandroid.widget.Toast;
public classMyDatabaseHelper extends SQLiteOpenHelper{
//创建表的代码
publicstatic final String CREATE_BOOK="create table book ("
+ "id integer primary keyautoincrement,"
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text)";
publicstatic final String CREATE_CATEGORY="create table category("
+ "id integer primary keyautoincrement, "
+ "category_name text, "
+ "category_codeinteger)";
privateContext context;
/**
* @paramcontext 上下文对象
* @paramname 数据库名称
*@param factory用于创建Cursor(结果集)的工程,默认传null即可
* @paramversion 数据库版本号
*/
publicMyDatabaseHelper(Context context, String name,
CursorFactoryfactory, int version) {
super(context,name, factory, version);
this.context= context;
}
//首次安装和启动清除APP数据库文件后调用
@Override
publicvoid onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(context, "创建成功", Toast.LENGTH_SHORT).show();
}
//版本升级时,更改了数据库的版本号后调用此方法(升级版本号)
@Override
publicvoid onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("update");
if(oldVersion< newVersion){
db.execSQL("droptable if exists book");
db.execSQL("droptable if exists category");
onCreate(db);
}
}
}
//使用数据库代码
packagecom.sqlitedemo;
importandroid.app.Activity;
importandroid.content.ContentValues;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.os.Bundle;
importandroid.view.Menu;
importandroid.view.MenuItem;
importandroid.view.View;
public classMainActivity extends Activity {
privateMyDatabaseHelper databaseHelper;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
databaseHelper = newMyDatabaseHelper(this,"xiaorou.db", null,1);//创建数据库
}
publicvoid create(View view) {
databaseHelper.getWritableDatabase();
}
publicvoid insert(View view) {
SQLiteDatabasedb = databaseHelper.getWritableDatabase();
ContentValuesvalues = new ContentValues();
//开始组装第一条数据
values.put("name","theda vinci code");
values.put("author","bbx");
values.put("pages",500);
values.put("price",19.99);
db.insert("book",null, values);//插入第一条数据
//开始组装第二条数据
values.put("name","thelost symbol");
values.put("author","bbx");
values.put("pages",600);
values.put("price",199.99);
db.replace("book",null, values);//插入第二条数据
}
publicvoid update(View view) {
SQLiteDatabasedb = databaseHelper.getWritableDatabase();
db.execSQL("alter table book rename toLove_book");//修改表名
// ContentValuesvalues = new ContentValues();
// values.put("price",99.9);
// db.update("book",values, "name=?", new String[]{"the da vinci code"});
}
publicvoid delete(View view) {
SQLiteDatabasedb = databaseHelper.getWritableDatabase();
db.delete("book","pages>?", new String[]{"500"});
}
publicvoid query(View view) {
SQLiteDatabasedb = databaseHelper.getWritableDatabase();
Cursorcursor = db.query("book", null, null, null, null, null, null);
if(cursor.moveToFirst()){
do{
//遍历Cursor对象,取出数据并打印
Stringname = cursor.getString(cursor.getColumnIndex("name"));
Stringauthor = cursor.getString(cursor.getColumnIndex("author"));
intpages = cursor.getInt(cursor.getColumnIndex("pages"));
doubleprice = cursor.getDouble(cursor.getColumnIndex("price"));
System.out.println(name+author+pages+price);
}while(cursor.moveToNext());
}
cursor.close();;
}
}
3.注意点:SQLite支持大部分标准的SQL语句,增删改查语句都是通用的,分页查询语句和MySQL相同(select* from users limit 10,20)/(select * from user limit 20 offset 10)
创建对象时,调用getWritableDatabase()或者getReadableDatabase():
情况1:数据库文件不存在,创建文件,打开数据库连接(得到SQLiteDatabase对象),执行
onCreate()方法。
情况2:数据库文件存在,版本号没变,打开数据库连接
情况3:数据库文件存在,版本号升级,升级数据库,打开数据连接,执行onUpgrade()方法。
情况4:数据库文件存在,版本号降低,执行onDowngrade()方法,方法在4.0会默认抛出一个
异常。
getWritableDatabase()和getReadableDatabase()区别:getReadableDatabase()通常情况下返回的就是getWritableDatabase()拿到的数据库,只有在抛出异常时拿到的数据库为只读的。
在做增删改时,使用getWritableDatabase()。在做查询时。使用getReadableDatabase()。
4.安卓中的单元测试
1.添加:<instrumentation android:name ="android.test.InstrumentationTestRunner" android:targerPackage="要测试的包名"></instrumentation>
2.添加:在<application>子节点下:
<uses-libraryandroid:name="android.test.runner"/>
3.自定义类继承AndroidTestCase
5.研究SQLiteOpenHelper类
实际项目中很少使用SQLiteDatabase的方法来打开数据库,都是继承SQLiteOpenHelper开发子类
并通过该子类的getReadableDatabase()、getWritableDatabase()方法发开数据库。
SQLiteOpenHelper是Android提供的一个管理数据库的工具类。方法有如下:
getReadableDatabase():以读写的方式打开数据库对应的SQLiteDatabase对象。
getWritableDatabase():以写的方式打开数据库对应的SQLiteDatabase对象。
onCreate():第一次创建数据库的时候回调该方法。
onUpgrade():当数据库版本更新时回调该方法。
Close():关闭所有打开的SQLiteDatabase。